工厂方法模式(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();

        }
    }

 

 //运行结果

posted @ 2012-04-07 10:22  ヾJ﹍Hヾ  阅读(198)  评论(0编辑  收藏  举报