抽象工廠模式(Abstract Factory Pattern)是工廠方法模式的進一步抽象,其英文原話"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻譯,“為建立一組相關或互相依賴的對象提供一個借口,無需指定它們的具體類”。抽象工廠模式通常是用于創一族産品,并且這族産品分不同的等級;不同的具體工廠類生産不同等級的一族産品。抽象工廠模式也有四種角色:抽象工廠、具體工廠、抽象産品和具體産品,具體解釋參見“Java 工廠方法模式”一文。
在上文女娲造人的基礎上,想把性别分出來,大概剛開始造的人沒分什麼男女吧~于是有:
男人:
public interface Man {
//強壯
public void strong();
}
女人:
public interface Woman {
//漂亮
public void beautiful();
}
黃種男人:
public class YellowMan implements Man {
@Override
public void strong() {
System.out.println("黃種男人的強壯!");
}
}
黃種女人:
public class YellowWoman implements Woman{
@Override
public void beautiful() {
System.out.println("黃種女人的漂亮!");
}
}
白種男人:
public class WhiteMan implements Man {
@Override
public void strong() {
System.out.println("白種男人的強壯!");
}
}
白種女人:
public class WhiteWoman implements Woman{
@Override
public void beautiful() {
System.out.println("白種女人的漂亮!");
}
}
黑種男人:
public class BlockMan implements Man{
@Override
public void strong() {
System.out.println("黑種男人的強壯!");
}
}
黑種女人:
public class BlockWoman implements Woman{
@Override
public void beautiful() {
System.out.println("黑種女人的漂亮!");
}
}
總工廠:
同時生産男人和女人(此處看作同一産品族,不同膚色看作不同産品等級結構)。
public interface HumanFactory {
Man createMan();
Woman createWoman();
}
黃種人生産線:
public class YellowFactory implements HumanFactory{
@Override
public Man createMan() {
return new YellowMan();
}
@Override
public Woman createWoman() {
return new YellowWoman();
}
}
白種人生産線:
public class WhiteFactory implements HumanFactory {
@Override
public Man createMan() {
return new WhiteMan();
}
@Override
public Woman createWoman() {
return new WhiteWoman();
}
}
黑種人生産線:
public class BlockFactory implements HumanFactory{
@Override
public Man createMan() {
return new BlockMan();
}
@Override
public Woman createWoman() {
return new BlockWoman();
}
}
女娲開始生産人:
public class Nvwa {
public static void main(String[] args) {
//建立黃色的男人和女人
HumanFactory hf = new YellowFactory();
hf.createMan().strong();
hf.createWoman().beautiful();
//建立黑色的男人和女人
HumanFactory wf = new WhiteFactory();
wf.createMan().strong();
wf.createWoman().beautiful();
//建立白色的男人和女人
HumanFactory bf = new BlockFactory();
bf.createWoman().beautiful();
bf.createMan().strong();
}
}
最後我們看看造人結果:

三種工廠模式的對比:
簡單工廠:
優點:
1、屏蔽産品的具體實作,調用者隻關心産品的接口。
2、實作簡單
缺點:
1、增加産品,需要修改工廠類,不符合開放-封閉原則
2、工廠類集中了所有執行個體的建立邏輯,違反了高内聚責任配置設定原則
工廠方法:
優點:
1、繼承了簡單工廠模式的優點
2、符合開放-封閉原則
缺點:
1、增加産品,需要增加新的工廠類,導緻系統類的個數成對增加,在一定程度上增加了系統的複雜性。
抽象工廠:
抽象工廠對開閉原則具有一定的傾斜性,比如以上栗子中,如果你要增加膚色,隻需要增加相應的膚色人種和相應的膚色工廠就可以,這樣很完美的貼合開閉原則。但是如果你要增加性别,那麼你就需要修改所有的工廠,這樣完全破壞了開閉原則。