zoukankan      html  css  js  c++  java
  • 工厂方法模式(Factory Method Pattern)

    一、工厂方法模式简介

       简单工厂是返回几个可能类中的一个实例,在我们讲解简单工厂的时候,人的类别太确定了,只有男人和女人。那么大家有没有想过这样一种情况,当类别非常多的时候,比如说,JH写了一个简单工厂(生产动物)的实例,现在JH写了两个动物类,狗和猫,由于需求,现在必需生产一个兔子类,那我们是不是要写个兔子类,然后在修改决策类的代码,如果创建兔子,则返回兔子类。但如果下一次又由于需求变更,又要生产老鼠类,那我们是不是要写个老鼠类,然后又修改决策类的代码。过一段时间,又要生产鱼,虾。。。。

      从上面描述可以看出,我们上述实例其实不仅每次浪费心力去修改决策类的代码,而且还破坏了设计模式的基本原则(开放封闭原则),然而如何让解决这一问题:创建的类是"易变"的,随之而来的就是本章的重点,工厂方法。

      工厂方法定义了一个用户创建对象的接口,本身不决定创建哪一个对象,让子类决定实例化哪一个对象。Factory Method使一个类的实例化延迟到其子类。

    二、解决问题

      由于需求的变化,对象的具体实现经常面临着剧烈的变化,如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变

    三、UML图

    四、示例

     //动物

    View Code
     /// <summary>
        /// 抽象类
        /// </summary>
       public abstract class AbstractAnimal
        {
           public abstract string GetName();
        }
        /// <summary>
        /// 狗类
        /// </summary>
       public class Dog : AbstractAnimal
       {
           public override string GetName()
           {
               return "Dog";
           }
       }
        /// <summary>
        ////// </summary>
       public class Cat : AbstractAnimal
       {
           public override string GetName()
           {
               return "Cat";
           }
       }

    //动物工厂

    View Code
    /// 抽象工厂
        /// &lt;/summary&gt;
        public abstract  class AbstractAnimalFactory
        {
           public abstract AbstractAnimal CreateAnimal();
        }
        /// &lt;summary&gt;
        /// 创建狗工厂
        /// &lt;/summary&gt;
        public class DogFactory:AbstractAnimalFactory
        {
            public override AbstractAnimal CreateAnimal()
            {
                return new Dog();
            }
        }
        /// &lt;summary&gt;
        /// 创建猫工厂
        /// &lt;/summary&gt;
        public class CatFactory : AbstractAnimalFactory
        {
            public override AbstractAnimal CreateAnimal()
            {
                return new Cat();
            }
        }

     //Program

    class Program
        {
            static void Main(string[] args)
            {
                AbstractAnimalFactory af = new DogFactory();
                AbstractAnimal aa = af.CreateAnimal();
                Console.WriteLine(aa.GetName());
    
    
                af = new CatFactory();
                aa = af.CreateAnimal();
                Console.WriteLine(aa.GetName());
    
    
                Console.Read();
    
            }
        }

     //运行结果

  • 相关阅读:
    使用qemu模拟调试内核和debian根文件系统
    qemu无界面启动,并重定向输出到终端
    linux 音频编程
    解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
    【BigData】Java基础_通用排序工具类的实现
    【BigData】Java基础_登录注册实现
    【费曼学习方法】世界上最好的学习方法
    【BigData】Java基础_接口
    【BigData】Java基础_Eclipse配置自动补全new
    【BigData】Java基础_HashSet
  • 原文地址:https://www.cnblogs.com/duandian/p/2435712.html
Copyright © 2011-2022 走看看