抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。
现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。
抽象工厂<nobr oncontextmenu="return false;" id="key5" onmousemove="kwM(5);" onmouseover="kwE(event,5, this);" onclick="return kwC();" target="_blank" onmouseout="kwL(event, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">模式</nobr>对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加<nobr oncontextmenu="return false;" id="key2" onmousemove="kwM(2);" onmouseover="kwE(event,2, this);" onclick="return kwC();" target="_blank" onmouseout="kwL(event, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">美国</nobr>系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。
使用抽象工厂模式的条件:
1 一个<nobr oncontextmenu="return false;" id="key3" onmousemove="kwM(3);" onmouseover="kwE(event,3, this);" onclick="return kwC();" target="_blank" onmouseout="kwL(event, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">系统</nobr>不应依赖于产品如何被创建,组合和表达的细节。
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<nobr oncontextmenu="return false;" id="key0" onmousemove="kwM(0);" onmouseover="kwE(event,0, this);" onclick="return kwC();" target="_blank" onmouseout="kwL(event, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">制作</nobr>北方面条..."); 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> /// <nobr oncontextmenu="return false;" id="key4" onmousemove="kwM(4);" onmouseover="kwE(event,4, this);" onclick="return kwC();" target="_blank" onmouseout="kwL(event, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline">应用</nobr>程序的主入口点。 /// </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(); } } }
|
分享到:
相关推荐
AbscractFactory 抽象工厂 设计模式,是asp.net(C#),内有web.config配置
抽象工厂实例适用于ASP.NET,C#语言。
ASP写的抽象工厂模式应用实例源码,对初学者有很大帮助!
ASP.NET企业级架构开发技术与案例教程,ASP.NET WebForm、抽象工厂模式三层架构、ASP.NET MVC、NHibernate、Spring.Net、ORM、IoC
Asp.net+jQuery+HttpHandler+抽象工厂+七层架构=经典实例
对于初学者来说,理解和掌握一种设计模式,并非易事,网上有些复杂点的程序,看懂和理解需要很长的时间,这个简单的抽象工厂练习,希望能帮助初学者了解抽象工厂并且在VS中配置它。当然本人能力有限,有不合理的地方...
3、设计模式采用的是抽象工厂的模式,有需要可以比较顺利地把数据库迁移到Access数据库 安装说明: 1、在SQLServer2005中附加文件夹Data内的数据库 2、更改WebConfig文件中数据库的链接。 如需帮助,请加QQ:...
ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动返回上次请求页面(小技巧) ASP.NET 2.0 控件 ASP...
ASP.NET 设计模式,Abstract Factory抽象工厂模式,Adapter适配器模式,Bridge桥接模式,Decorator装饰模式 等等40多种设计模式,适用于有一定经验的开发者学习
ASP.NET 标准三层架构留言本,支持SQL2000和ACCESS两种数据库. 带抽象工厂,学习三层的朋友可以看下 BLL: 业务层 DALFactory:数据工厂 Utility:数据访问层 IDAL:接口层 Model: 数据实体层 SQLServerDAL: SQL数据层...
三层架构抽象工厂模式说明文档汇总 由于大小问题具体示例已单独上传,如果需要可以下载
C#实现的三层架构 + 抽象工厂类实例,结构清晰,适合初学者学习
ASP.NET 4高级程序设计(第4版)》【原版书为:Pro ASP.NET 4 in C# 2010】是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的...
三层架构抽象工厂模式示例 由于大小问题三层架构抽象工厂模式文档已单独上传,此外还有手动搭建三层架构的视频,如果需要可以下载
抽象工厂,用于创建各种数据对象的方法,这里有配置文件和反射的运用。 -------Model------- Model程序集,存放实体类,用于数据访问层和逻辑层调用 -------IDAL-------- 数据操作接口,数据访问层实现其接口并...
使用了抽象工厂模式 /App_Data/DB文件夹下的数据库是实例的一部分,可以删除 /App_Data下的QQWry.Dat文件是IP纯真数据库,判断IP地址用,不需要可以删除 Util项目为常用工具包,不需要可删除 调试和发布需要手动...
自己用asp.net写的一个计算器。用到了抽象工厂。 自己写的一个计算器。用到了抽象工厂。
基于ASP.NET实现抽象工厂版新闻网站完整源码,内含数据库文件,100%正常运行,欢迎下载,有问题可留言!
软件架构各种模式c#源代码举例例如:策略模式、装饰模式、命令模式、抽象工厂模式、状态模式等