横槊临江

New give up !

导航

c#抽象工厂模式

抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。 
现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。 
抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。 
使用抽象工厂模式的条件: 
1 一个系统不应依赖于产品如何被创建,组合和表达的细节。 
2 有多个产品族,而系统只消费其中一个族中的产品 
3 同属于一个产品族的产品是在一起使用的。 
4 系统提供一个产品的库,所有产品都是以同样的接口实现。 

看下面的C#实现: 

using System; 

namespace AbstractFactory 
{ 
/// <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(); 
} 
} 
}

 

posted on 2013-11-16 19:20  jian60521  阅读(536)  评论(0编辑  收藏  举报