当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET教程:抽象工厂模式

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

ASP.NET教程:抽象工厂模式


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 108 ::
收藏到网摘: n/a

摘要:介绍了抽象工厂模式的基本概念,并给出了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();
        }
    }
}