• 设计模式(C#)——02抽象工厂模式


    推荐阅读:

          在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品。很明显工厂模式已经不能满足我们的需求,于是出现了抽象工厂模式。
          抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    抽象工厂模式:

    1.首先是不同产品类的抽象;
    2.其次是不同工厂类的抽象;
    3.最后是产品不同系列的抽象;

    抽象工厂模式要素:

    1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
    2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
    3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
    4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。

    下面举个例子来介绍一下上面几个要素之间的关系吧。
    例如:命名空间抽象工厂方法模式中包含抽象工厂Factory;具体工厂MNFactory ,YLFactory;抽象产品Milk,Yogurt;具体产品YLMilk,MNMilk,YLYogurt,MNYogurt 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
    代码实现过程:
    1.创建抽象产品:

    	interface Milk//所有牛奶的父类
        {
            void DisPlay();//显示牛奶品牌
        }
        interface Yogurt//所有酸奶的父类
        {
            void Display();//显示酸奶品牌
        }
    
    1. 所有的具体产品的代码(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
    	class YLMilk:Milk//伊利牛奶
        {
            public void DisPlay()
            {
                Console.WriteLine("我是伊利牛奶!");
            }
        }
        class MNMilk:Milk//蒙牛牛奶
        {
            public void DisPlay()
            {
                Console.WriteLine("我是蒙牛牛奶!");
            }
        }
        class YLYogurt:Yogurt//伊利酸奶
        {
            public void Display()
            {
                Console.WriteLine("我是伊利酸奶!");
            }
        }
        class MNMilk:Yogurt//蒙牛酸奶
        {
            public void Display()
            {
                Console.WriteLine("我是蒙牛酸奶!");
            }
        }
    

    3.抽象工厂

    interface Factory//所有工厂的父类
        {
            Milk CreateMilk();//生产牛奶
            Yogurt CreateYogurt();//生产酸奶
        }
    

    4.具体工厂(伊利工厂,蒙牛工厂)

    class YLFactory:Factory//伊利工厂
        {
            public Milk CreateMilk()//生产伊利牛奶
            {
                return new YLMilk();
            }
     
            public Yogurt CreateYogurt()//生产伊利酸奶
            {
                return new YLYogurt();
            }
        }
        class MNFactory:Factory//蒙牛工厂
        {
            public MNMilk CreateMilk()//生产蒙牛牛奶
            {
                return new MNMilk();
            }
     
            public MNYogurt CreateYogurt()//生产蒙牛酸奶
            {
                return new MNYogurt();
            }
    

    5.使用该工厂

    namespace 抽象工厂模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Factory fact1 = new YLFactory();
                
                Milk milk;
                milk = fact1.CreateMilk();
                milk.Display();
                
                Yogurt yogurt;
                yogurt= fact1.CreateYogurt();
                yogurt.Display();
                Console.ReadLine();
            }
        }
    }
    

    整合后的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace 抽象工厂模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Factory fact1 = new YLFactory();
                
                Milk milk;
                milk = fact1.CreateMilk();
                milk.Display();
                
                Yogurt yogurt;
                yogurt= fact1.CreateYogurt();
                yogurt.Display();
                Console.ReadLine();
            }
        }
    }
    
    
    interface Milk//所有牛奶的父类
    {
         void DisPlay();//显示牛奶品牌
    }
    interface Yogurt//所有酸奶的父类
    {
         void Display();//显示酸奶品牌
    }
    class YLMilk:Milk//伊利牛奶
    {
        public void DisPlay()
        {
            Console.WriteLine("我是伊利牛奶!");
        }
    }
    class MNMilk:Milk//蒙牛牛奶
    {
        public void DisPlay()
        {
            Console.WriteLine("我是蒙牛牛奶!");
        }
     }
    
    
    class YLYogurt:Yogurt//伊利酸奶
    {
        public void Display()
        {
             Console.WriteLine("我是伊利酸奶!");
        }
    }
    class MNMilk:Yogurt//蒙牛酸奶
    {
         public void Display()
         {
              Console.WriteLine("我是蒙牛酸奶!");
         }
    }
    
    interface Factory//所有工厂的父类
    {
        Milk CreateMilk();//生产牛奶
        Yogurt CreateYogurt();//生产酸奶
    }
    
    class YLFactory:Factory//伊利工厂
    {
        public Milk CreateMilk()//生产伊利牛奶
        {
            return new YLMilk();
        }
     
       public Yogurt CreateYogurt()//生产伊利酸奶
       {
            return new YLYogurt();
        }
    }
    class MNFactory:Factory//蒙牛工厂
    {
        public MNMilk CreateMilk()//生产蒙牛牛奶
        {
            return new MNMilk();
        }
     
        public MNYogurt CreateYogurt()//生产蒙牛酸奶
        {
            return new MNYogurt();
        }
     }
    

          总之一点,在抽象工厂模式中,客户端必须针对接口编程,绝对不能针对具体的实现类编程。否则无法保证程序的扩展性和灵活性。不仅仅抽象工厂,在其他的工厂模式中也都是针对接口(抽象)编程。

          如果对于抽象工厂模式,你有更好的见解,欢迎评论区留言讨论。

  • 相关阅读:
    Educational Codeforces Round 86 (Rated for Div. 2)
    第十六届东南大学大学生程序设计竞赛(春、夏季)
    Codeforces Round #643 (Div. 2)
    [P3384] 【模板】轻重链剖分
    [BJOI2012] 连连看
    [CF1349C] Orac and Game of Life
    Codeforces Round #641 (Div. 2)
    [TJOI2018] 数学计算
    [CF1157D] N Problems During K Days
    [CF1163C1] Power Transmission (Easy Edition)
  • 原文地址:https://www.cnblogs.com/shirln/p/10245217.html
Copyright © 2020-2023  润新知