天天看點

23種設計模式之-----抽象工廠模式(AbstractFactory pattern)

抽象工廠模式(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();
	}
}
           

最後我們看看造人結果:

23種設計模式之-----抽象工廠模式(AbstractFactory pattern)

三種工廠模式的對比:

簡單工廠:

優點:

1、屏蔽産品的具體實作,調用者隻關心産品的接口。

2、實作簡單

缺點:

1、增加産品,需要修改工廠類,不符合開放-封閉原則

2、工廠類集中了所有執行個體的建立邏輯,違反了高内聚責任配置設定原則

工廠方法:

優點:

1、繼承了簡單工廠模式的優點

2、符合開放-封閉原則

缺點:

1、增加産品,需要增加新的工廠類,導緻系統類的個數成對增加,在一定程度上增加了系統的複雜性。

抽象工廠:

抽象工廠對開閉原則具有一定的傾斜性,比如以上栗子中,如果你要增加膚色,隻需要增加相應的膚色人種和相應的膚色工廠就可以,這樣很完美的貼合開閉原則。但是如果你要增加性别,那麼你就需要修改所有的工廠,這樣完全破壞了開閉原則。