一、工厂方法模式简介
简单工厂是返回几个可能类中的一个实例,在我们讲解简单工厂的时候,人的类别太确定了,只有男人和女人。那么大家有没有想过这样一种情况,当类别非常多的时候,比如说,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
/// 抽象工厂 /// </summary> public abstract class AbstractAnimalFactory { public abstract AbstractAnimal CreateAnimal(); } /// <summary> /// 创建狗工厂 /// </summary> public class DogFactory:AbstractAnimalFactory { public override AbstractAnimal CreateAnimal() { return new Dog(); } } /// <summary> /// 创建猫工厂 /// </summary> 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(); } }
//运行结果