摘要:介紹了抽象工廠模式的基本概念,並給出了c#語言編寫的程序示例
抽象工廠模式向客戶端提供一個接口,使得客戶端在不必指定具體類型的情況下,創建多個產品族中的對象。本文采取的仍然是接著以前的那個快餐店的例子。
現在,快餐店經常良好,逐漸發展壯大,為了適合不同地方人的飲食習慣,創建了兩大系列(相當於產品族)快餐,北方系列和南方系列。每個系列分別由一個大廚掌勺。
抽象工廠模式對新的產品族支持開閉原則,但對新的產品不支持開閉原則。例如增加新的產品族,如增加美國系列快餐(相當於增加了一個產品族),則只要從每個產品接口繼承一個相應美國系列產品即可,不需要更改已有的代碼。但如果增加新產品,比如增加了“饅頭”這個產品,則它是不支持開閉原則的,因為你要在廚師接口中,增加返回“饅頭”的方法,這就要修改已存在的接口,而修改了上層接口,繼承此接口的具體類也要隨之改變。
使用抽象工廠模式的條件:
1 一個系統不應依賴於產品如何被創建,組合和表達的細節。
2 有多個產品族,而系統只消費其中一個族中的產品
3 同屬於一個產品族的產品是在一起使用的。
4 系統提供一個產品的庫,所有產品都是以同樣的接口實現。
看下面的C#實現:
namespace ConsoleApplication1
{
/// <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)
{
//針對接口編程,創建對象盡量返回上層接口,避免使用具體類
//下面隱藏了具體的創建各種面條,米飯和面包的過程
Console.WriteLine("\n-------------北方廚師-------------------\n");
Chef northChef=new NorthChef();
northChef.MakeNoodle();
northChef.MakeRice();
northChef.MakeBread();
Console.WriteLine("\n-------------南方廚師-------------------\n");
Chef southChef=new SouthChef();
southChef.MakeNoodle();
southChef.MakeRice();
southChef.MakeBread();
Console.ReadLine();
}
}
}