`
jdlsfl
  • 浏览: 156001 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ASP.NET教程:抽象工厂模式(C#)

阅读更多

抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。

现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。

抽象工厂<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();
        }
    }
}

 

分享到:
评论

相关推荐

    asp.net抽象工厂设计模式

    AbscractFactory 抽象工厂 设计模式,是asp.net(C#),内有web.config配置

    ASP.NET(C#)抽象工厂实例

    抽象工厂实例适用于ASP.NET,C#语言。

    (ASP)抽象工厂模式源码

    ASP写的抽象工厂模式应用实例源码,对初学者有很大帮助!

    ASP.NET企业级架构开发技术与案例教程

    ASP.NET企业级架构开发技术与案例教程,ASP.NET WebForm、抽象工厂模式三层架构、ASP.NET MVC、NHibernate、Spring.Net、ORM、IoC

    Asp.net+jQuery+HttpHandler+抽象工厂+七层架构=经典实例

    Asp.net+jQuery+HttpHandler+抽象工厂+七层架构=经典实例

    C# asp.net抽象工厂 简单登录页

    对于初学者来说,理解和掌握一种设计模式,并非易事,网上有些复杂点的程序,看懂和理解需要很长的时间,这个简单的抽象工厂练习,希望能帮助初学者了解抽象工厂并且在VS中配置它。当然本人能力有限,有不合理的地方...

    一扬开源新闻静态生成系统(ASP.NET)

    3、设计模式采用的是抽象工厂的模式,有需要可以比较顺利地把数据库迁移到Access数据库 安装说明: 1、在SQLServer2005中附加文件夹Data内的数据库 2、更改WebConfig文件中数据库的链接。 如需帮助,请加QQ:...

    asp.net知识库

    ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动返回上次请求页面(小技巧) ASP.NET 2.0 控件 ASP...

    ASP.NET设计模式

    ASP.NET 设计模式,Abstract Factory抽象工厂模式,Adapter适配器模式,Bridge桥接模式,Decorator装饰模式 等等40多种设计模式,适用于有一定经验的开发者学习

    三层架构asp.net(C#)留言板

    ASP.NET 标准三层架构留言本,支持SQL2000和ACCESS两种数据库. 带抽象工厂,学习三层的朋友可以看下 BLL: 业务层 DALFactory:数据工厂 Utility:数据访问层 IDAL:接口层 Model: 数据实体层 SQLServerDAL: SQL数据层...

    三层架构抽象工厂模式说明文档汇总

    三层架构抽象工厂模式说明文档汇总 由于大小问题具体示例已单独上传,如果需要可以下载

    三层架构 + 抽象工厂类实例

    C#实现的三层架构 + 抽象工厂类实例,结构清晰,适合初学者学习

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    ASP.NET 4高级程序设计(第4版)》【原版书为:Pro ASP.NET 4 in C# 2010】是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的...

    三层架构抽象工厂示例(源代码)

    三层架构抽象工厂模式示例 由于大小问题三层架构抽象工厂模式文档已单独上传,此外还有手动搭建三层架构的视频,如果需要可以下载

    asp.net(c#)多层分布式架构实例源码

    抽象工厂,用于创建各种数据对象的方法,这里有配置文件和反射的运用。 -------Model------- Model程序集,存放实体类,用于数据访问层和逻辑层调用 -------IDAL-------- 数据操作接口,数据访问层实现其接口并...

    asp.net mvc 2.0 for .net 4 标准项目框架

    使用了抽象工厂模式 /App_Data/DB文件夹下的数据库是实例的一部分,可以删除 /App_Data下的QQWry.Dat文件是IP纯真数据库,判断IP地址用,不需要可以删除 Util项目为常用工具包,不需要可删除 调试和发布需要手动...

    用抽象工厂做的一个计算器

    自己用asp.net写的一个计算器。用到了抽象工厂。 自己写的一个计算器。用到了抽象工厂。

    抽象工厂新闻网站.rar

    基于ASP.NET实现抽象工厂版新闻网站完整源码,内含数据库文件,100%正常运行,欢迎下载,有问题可留言!

    软件架构与设计模式代码集

    软件架构各种模式c#源代码举例例如:策略模式、装饰模式、命令模式、抽象工厂模式、状态模式等

Global site tag (gtag.js) - Google Analytics