抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。
现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。
抽象工厂<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(); } } }
|
分享到:
相关推荐
在`.NET`中,可以使用C#语言实现抽象工厂模式,利用接口和抽象类来定义和实现各个层次的对象。同时,可以利用依赖注入框架(如Autofac、Unity或Ninject)来管理工厂的实例,进一步提高代码的灵活性和测试性。 总结...
ASP.NET和C#是开发Web应用程序的常用技术组合,其中C#是一种面向对象的编程语言,而ASP.NET是一个用于构建动态网站、Web应用和Web服务的...深入研究这些代码,可以更好地理解如何在ASP.NET和C#环境中应用抽象工厂模式。
在本实例中,我们将深入探讨如何在ASP中应用抽象工厂模式。 首先,我们来看抽象工厂模式的基本结构。抽象工厂通常包含一个抽象工厂接口(Abstract Factory),这个接口定义了一系列创建产品的方法。然后,有一系列...
在Asp.net项目中,抽象工厂可以用于数据库连接、日志记录、邮件服务等跨层的服务创建,使得系统更加灵活,易于扩展和维护。 【七层架构】 七层架构通常指的是网络通信的OSI模型(开放系统互连模型),包括物理层、...
在ASP.NET项目中,工厂模式可以用来抽象对象的创建过程,使得代码更加灵活,易于替换或扩展。例如,在校园网站中,可能有一个用户工厂类,用于创建和管理不同的用户类型(如学生、教师和管理员)。 这个校园网站...
.NET抽象工厂模式在三层架构中的应用是一个典型的软件设计模式实践,尤其在开发复杂的企业级应用程序时,这种模式显得尤为重要。三层架构是一种常见的软件分层结构,主要包括表现层(UI)、业务逻辑层(BLL)和数据...
本文将深入探讨几种在ASP.NET中常见的设计模式,包括Abstract Factory(抽象工厂)、Adapter(适配器)、Bridge(桥接)和Decorator(装饰)模式。 1. 抽象工厂模式(Abstract Factory): 抽象工厂模式提供一个...
7. **ASP.NET**:用于开发Web应用的技术,包括MVC模式和Web Forms。 8. **单元测试**:理解测试驱动开发(TDD),使用NUnit等工具编写单元测试。 9. **调试技巧**:学习使用Visual Studio或其他IDE进行调试,查找并...
《ASP.NET结合工厂模式构建的酒店管理系统详解》 在软件开发领域,ASP.NET是一种广泛使用的Web应用程序框架,它由微软公司开发,旨在简化Web应用的创建和维护。结合工厂模式,我们可以构建出更加灵活、可扩展的系统...
在学习和分析ACCPBBS系统的过程中,除了关注抽象工厂模式的应用,我们还需要理解ASP.NET Web应用程序的生命周期、C#编程基础、ADO.NET数据访问技术,以及.NET框架的核心概念。这些知识点都是构建高效、稳定的Web应用...
4. 如何利用抽象工厂模式在ASP.NET项目中创建和管理数据访问对象,以支持不同数据库系统的切换。 5. 实际应用中,如何根据项目需求调整和优化抽象工厂的实现。 通过深入理解并实践这个示例,你将能够更好地运用三层...
在这个“asp.net c#面向对象虚拟工厂程序”中,我们将探讨C#中的面向对象特性以及如何结合ASP.NET来实现三层架构。 首先,面向对象编程的核心概念包括封装、继承、多态和抽象。在C#中,我们通过类(Class)来定义...
三层架构和抽象工厂模式是软件开发中常见的设计模式和技术架构,尤其在C#和ASP.NET应用中被广泛采用。下面将详细阐述这两种概念及其在实际项目中的应用。 **三层架构(Three-Tier Architecture)** 三层架构是一种...
对于"2款代码生成器(asp.net数据库业务以及项目工厂模式 和层结构)"这个主题,我们将深入探讨这两款工具如何帮助开发者构建ASP.NET应用程序,特别是涉及到数据库交互、业务逻辑和设计模式的应用。 首先,ASP.NET是...
在ASP.NET MVC中,视图引擎的选择就是抽象工厂模式的应用。 4. **建造者模式(Builder)**:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在数据库实体构建或XML序列化时,我们可以看到...
对于初学者来说,理解和掌握一种设计模式,并非易事,网上有些复杂点的程序,看懂和理解需要很长的时间,这个简单的抽象工厂练习,希望能帮助初学者了解抽象工厂并且在VS中配置它。当然本人能力有限,有不合理的地方...
在.NET框架下,我们可以利用C#语言和ASP.NET技术来实现工厂模式。本文将详细讲解如何在ASP.NET项目中构建一个SDP(Software Development Process,软件开发过程)工厂模式。 首先,理解工厂模式的基本概念。工厂...
【C# MySchool 抽象工厂与三层架构模式详解】 在C#编程中,`抽象工厂`模式是一种设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在`MySchool`项目中,抽象工厂可能被用来创建...
- **ASP.NET**:深入理解Web应用开发,包括MVC模式和Web Forms。 3. **LINQ(Language Integrated Query)**: - **查询表达式与方法语法**:熟悉两种不同的LINQ查询方式,以及如何在数据库、集合和其他数据源上...
3、设计模式采用的是抽象工厂的模式,有需要可以比较顺利地把数据库迁移到Access数据库 安装说明: 1、在SQLServer2005中附加文件夹Data内的数据库 2、更改WebConfig文件中数据库的链接。 如需帮助,请加QQ:...