天天看點

抽象工廠案例解析

類圖解析:

  1. 通過抽象類的方式建立抽象産品類Phone,并聲明抽象方法producePhone
  2. 通過抽象類的方式建立抽象産品類NoteBook,并聲明抽象方法produceNoteBook
  3. 通過接口的方式建立抽象工廠Factory,并聲明接口方法getPhone,getNoteBook
  4. 通過實作抽象工廠接口建立具體工廠類AppleFactory,該類中可生産具體的産品ApplePhone及AppleMackBook:通過繼承抽象類Phone實作具體産品ApplePhone,并覆寫重寫producePhone方法,通過繼承抽象類NoteBook實作具體産品AppleMackBook,并覆寫重寫produceNoteBook方法
  5. 通過實作抽象工廠接口建立具體工廠類HuaweiFactory,該類中可生産具體的産品HuaweiPhone及HuaWeiMackBook:通過繼承抽象類Phone實作具體産品HuaweiPhone,并覆寫重寫producePhone方法,通過繼承抽象類NoteBook實作具體産品HuaweiNoteBook,并覆寫重寫produceNoteBook方法
  6. 通過Test測試類進行測試:通過Factory接口生成appleFactory對象與huaweiFactory對象,調用對象中的producePhone與produceNoteBook方法,傳回實際結果

代碼如下:

//Phone抽象類,可以用接口方式代替
public abstract class Phone {
    abstract  void producePhone();
}
//NoteBook抽象類,可以用接口方式代替
public abstract class NoteBook {
    abstract void produceNoteBook();
}
//抽象工廠
public interface Factory {
    Phone getPhone();
    NoteBook getNoteBook();
}
//Apple Phone類
public class ApplePhone extends Phone {
    @Override
    void producePhone() {
        System.out.println("生産蘋果手機");
    }
}
//Apple MacBook類
public class AppleMacBook extends NoteBook {
    @Override
    void produceNoteBook() {
        System.out.println("生産蘋果MacBook");

    }
}
//Apple工廠類
public class AppleFactory implements Factory {
    @Override
    public Phone getPhone() {
        return new ApplePhone();
    }

    @Override
    public NoteBook getNoteBook() {
        return new AppleMacBook();
    }
}
//Huawei Phone類
public class HuaweiPhone extends Phone {
    @Override
    void producePhone() {
        System.out.println("生産華為手機");
    }
}
//Huawei NoteBook類
public class HuaweiNoteBook extends NoteBook {
    @Override
    void produceNoteBook() {
        System.out.println("生産華為筆記本電腦");
    }
}
//Huawei工廠類
public class HuaweiFactory implements Factory {
    @Override
    public Phone getPhone() {
        return new HuaweiPhone();
    }

    @Override
    public NoteBook getNoteBook() {
        return new HuaweiNoteBook();
    }
}
//測試類
public class Test {
    public static void main(String[] args) {
        Factory appleFactory = new AppleFactory();
        appleFactory.getPhone().producePhone();
        appleFactory.getNoteBook().produceNoteBook();
        
        Factory huaweiFactory = new HuaweiFactory();
        huaweiFactory.getPhone().producePhone();
        huaweiFactory.getNoteBook().produceNoteBook();
    }
}      

總結:

  1. 抽象方法是對工廠方法的進一步拓展,抽象工廠可以支援産品系列或支援多種業務
  2. 抽象工廠實作起來很麻煩,如果有工廠的産品系列又多了一種産品的功能,那麼很多地方都要重寫。
  3. 抽象工廠好處就在于,當AppleFactory這種類型的工廠停用啟用新的工廠NewAppleFactory的時候,可以很友善的在應用代碼裡用同系列的new NewAppleFactory()替換掉就可以了,其他的什麼都不需要改。