類圖解析:
- 通過抽象類的方式建立抽象産品類Phone,并聲明抽象方法producePhone
- 通過抽象類的方式建立抽象産品類NoteBook,并聲明抽象方法produceNoteBook
- 通過接口的方式建立抽象工廠Factory,并聲明接口方法getPhone,getNoteBook
- 通過實作抽象工廠接口建立具體工廠類AppleFactory,該類中可生産具體的産品ApplePhone及AppleMackBook:通過繼承抽象類Phone實作具體産品ApplePhone,并覆寫重寫producePhone方法,通過繼承抽象類NoteBook實作具體産品AppleMackBook,并覆寫重寫produceNoteBook方法
- 通過實作抽象工廠接口建立具體工廠類HuaweiFactory,該類中可生産具體的産品HuaweiPhone及HuaWeiMackBook:通過繼承抽象類Phone實作具體産品HuaweiPhone,并覆寫重寫producePhone方法,通過繼承抽象類NoteBook實作具體産品HuaweiNoteBook,并覆寫重寫produceNoteBook方法
- 通過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();
}
}
總結:
- 抽象方法是對工廠方法的進一步拓展,抽象工廠可以支援産品系列或支援多種業務
- 抽象工廠實作起來很麻煩,如果有工廠的産品系列又多了一種産品的功能,那麼很多地方都要重寫。
- 抽象工廠好處就在于,當AppleFactory這種類型的工廠停用啟用新的工廠NewAppleFactory的時候,可以很友善的在應用代碼裡用同系列的new NewAppleFactory()替換掉就可以了,其他的什麼都不需要改。