zoukankan      html  css  js  c++  java
  • 简单理解C#中的抽象工厂模式是什么概念!

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

    使用抽象工厂模式的条件:
    1 一个系统不应依赖于产品如何被创建,组合和表达的细节。
    2 有多个产品族,而系统只消费其中一个族中的产品
    3 同属于一个产品族的产品是在一起使用的。
    4 系统提供一个产品的库,所有产品都是以同样的接口实现。

    看下面的C#实现:

        /// <summary> 
        /// 抽象工厂模式示例 
        /// </summary> 
        class AbstractFactory
        {
            //定义厨师的抽象工厂 
            public interface Chef
            {
                //这里定义厨师的公共操作 
                //返回抽象面条 
                Noodle MakeNoodle();
                //返回抽象米饭
                Rice MakeRice();
                //返回抽象面包 
                Bread MakeBread();
            }
    
            //定义北方厨师,实现厨师接口 
            class NorthChef : Chef
            {
                public Noodle MakeNoodle()
                {
                    Console.WriteLine("
    制作北方面条...");
                    Noodle noodle = new NorthNoodle();
                    return noodle;
                }
                public Rice MakeRice()
                {
                    Console.WriteLine("
    制作北方米饭...");
                    Rice rice = new NorthRice();
                    return rice;
                }
                public Bread MakeBread()
                {
                    Console.WriteLine("
    正在制作北方面包..");
                    Bread bread = new NorthBread(); return bread;
                }
            }
            //定义南方厨师,实现厨师接口 
            class SouthChef : Chef
            {
                public Noodle MakeNoodle()
                {
                    Console.WriteLine("
    正在制作南方面条。。。");
                    Noodle noodle = new SouthNoodle();
                    return noodle;
                }
                public Rice MakeRice()
                {
                    Console.WriteLine("
    正在制作南方米饭。。。");
                    Rice rice = new SouthRice();
                    return rice;
                }
                public Bread MakeBread()
                {
                    Console.WriteLine("
    正在制作南方面包。。。");
                    Bread bread = new SouthBread();
                    return bread;
                }
            }
    
            //定义面条产品 
            public interface Noodle
            {
                //这里定义面条的公共操作 
            }
            class NorthNoodle : Noodle
            {
                public NorthNoodle()
                {
                    Console.WriteLine("
    一碗地道的北方面条产生了");
                }
            }
            class SouthNoodle : Noodle
            {
                public SouthNoodle()
                {
                    Console.WriteLine("
    一碗地道的南方面条产生了");
                }
            }
            //定义米饭产品 
            public interface Rice
            {
                //这里定义米饭的公共操作 
            }
            class NorthRice : Rice
            {
                public NorthRice()
                {
                    Console.WriteLine("
    一碗地道的北方米饭产生了,真好吃");
                }
            }
            class SouthRice : Rice
            {
                public SouthRice()
                {
                    Console.WriteLine("
    一碗地道的南方米饭产生了,真难吃");
                }
            }
            //定义面包 
            public interface Bread
            {
                //这里可以定义一些面包的公共操作 
            }
            class NorthBread : Bread
            {
                public NorthBread()
                {
                    Console.WriteLine("
    一个地道的北方面包产生了");
                }
            }
            class SouthBread : Bread
            {
                public SouthBread()
                {
                    Console.WriteLine("
    一个地道的南方面包产生了");
                }
            }
        }

    应用程序的实现:

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

    其实就这样!
    抽象工厂产生实体工厂,实体工厂生产实体产品,而实体产品又属于抽象产品!
    最终直接面向客户的是抽象工厂和抽象产品

  • 相关阅读:
    ajax的post请求
    ajax的get请求
    浏览器缓存机制
    php和cookie
    php表单(2)
    php和表单(1)
    枚举for/in
    .Matrix-Beta冲刺的汇总博客
    .Matrix汇总博客
    小黄衫获得的感想
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/3725811.html
Copyright © 2011-2022 走看看