抽象工廠模式向客戶端提供一個接口,使得客戶端在沒必要指定具體類型的狀況下,建立多個產品族中的對象。本文采起的仍然是接着之前的那個快餐店的例子。如今,快餐店常常良好,逐漸發展壯大,爲了適合不一樣地方人的飲食習慣,建立了兩大系列(至關於產品族)快餐,北方系列和南方系列。每一個系列分別由一個大廚掌勺。抽象工廠模式對新的產品族支持開閉原則,但對新的產品不支持開閉原則。例如增長新的產品族,如增長美國系列快餐(至關於增長了一個產品族),則只要從每一個產品接口繼承一個相應美國系列產品便可,不須要更改已有的代碼。但若是增長新產品,好比增長了「饅頭」這個產品,則它是不支持開閉原則的,由於你要在廚師接口中,增長返回「饅頭」的方法,這就要修改已存在的接口,而修改了上層接口,繼承此接口的具體類也要隨之改變。編程
使用抽象工廠模式的條件:
1 一個系統不該依賴於產品如何被建立,組合和表達的細節。
2 有多個產品族,而系統只消費其中一個族中的產品
3 同屬於一個產品族的產品是在一塊兒使用的。
4 系統提供一個產品的庫,全部產品都是以一樣的接口實現。spa
看下面的C#實現:code
/// <summary> /// 抽象工廠模式示例 /// </summary> class AbstractFactory { //定義廚師的抽象工廠 public interface Chef { //這裏定義廚師的公共操做 //返回抽象麪條 Noodle MakeNoodle(); //返回抽象米飯 Rice MakeRice(); //返回抽象麪包 Bread MakeBread(); } //定義北方廚師,實現廚師接口 class NorthChef : Chef { public Noodle MakeNoodle() { Console.WriteLine("\n製做北方面條..."); Noodle noodle = new NorthNoodle(); return noodle; } public Rice MakeRice() { Console.WriteLine("\n製做北方米飯..."); Rice rice = new NorthRice(); return rice; } public Bread MakeBread() { Console.WriteLine("\n正在製做北方面包.."); Bread bread = new NorthBread(); return bread; } } //定義南方廚師,實現廚師接口 class SouthChef : Chef { public Noodle MakeNoodle() { Console.WriteLine("\n正在製做南方面條。。。"); Noodle noodle = new SouthNoodle(); return noodle; } public Rice MakeRice() { Console.WriteLine("\n正在製做南方米飯。。。"); Rice rice = new SouthRice(); return rice; } public Bread MakeBread() { Console.WriteLine("\n正在製做南方面包。。。"); Bread bread = new SouthBread(); return bread; } } //定義麪條產品 public interface Noodle { //這裏定義麪條的公共操做 } class NorthNoodle : Noodle { public NorthNoodle() { Console.WriteLine("\n一碗地道的北方面條產生了"); } } class SouthNoodle : Noodle { public SouthNoodle() { Console.WriteLine("\n一碗地道的南方面條產生了"); } } //定義米飯產品 public interface Rice { //這裏定義米飯的公共操做 } class NorthRice : Rice { public NorthRice() { Console.WriteLine("\n一碗地道的北方米飯產生了,真好吃"); } } class SouthRice : Rice { public SouthRice() { Console.WriteLine("\n一碗地道的南方米飯產生了,真難吃"); } } //定義麪包 public interface Bread { //這裏能夠定義一些麪包的公共操做 } class NorthBread : Bread { public NorthBread() { Console.WriteLine("\n一個地道的北方面包產生了"); } } class SouthBread : Bread { public SouthBread() { Console.WriteLine("\n一個地道的南方面包產生了"); } } }
應用程序的實現:對象
/// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main(string[] args) { //針對接口編程,建立對象儘可能返回上層接口,避免使用具體類 //下面隱藏了具體的建立各類麪條,米飯和麪包的過程 Chef northChef=new NorthChef(); northChef.MakeNoodle(); northChef.MakeRice(); northChef.MakeBread(); Chef southChef=new SouthChef(); southChef.MakeBread(); southChef.MakeNoodle(); southChef.MakeRice(); Console.ReadLine(); }
其實就這樣!
抽象工廠產生實體工廠,實體工廠生產實體產品,而實體產品又屬於抽象產品!
最終直接面向客戶的是抽象工廠和抽象產品blog