设计模式学习(三)------工厂方法模式

来源:互联网 发布:mobi格式软件ios 编辑:程序博客网 时间:2024/06/11 01:16

设计模式学习(三)——工厂方法模式

在前一篇文章中,谈到了简单工厂模式的缺点,就是它难以扩展,一旦添加新的产品就不得不修改工厂的逻辑。
工厂方法模式就是为了解决这个问题而产生的。与简单工厂模式不同的是,它将具体产品的制造放到了子类中,此时它不再负责生产具体的产品,而只是给出具体工厂必须实现的一个接口。

一个例子

public class Customer{    static void Main(string[] args)    {        //开设两个新的造车工厂        CarFactory benzcar = new BenzFactory();        CarFactory bmwcar = new BMWFactory();        //制造Benz汽车        Car benz = benzcar.CreateCarFactory();        benz.Print();        //制造BmW汽车        Car bmw = bmwcar.CreateCarFactory();        bmw.Print();        Console.Read();    }}public abstract class Car{    public abstract void Print();}//public class BMW:Car{    public BMW(){    }    public override void Print()    {        Console.WriteLine("This is BMW!\n");    }}public class Benz:Car{    public Benz(){    }    public override void Print()    {        Console.WriteLine("This is Benz!\n");    }}//抽象工厂类,相当于汽车制造总部,只负责提出计划,具体工作由子制造工厂完成public abstract class CarFactory{    public abstract Car CreateCarFactory()    {    }}//Benz制造工厂,只负责制造Benzpublic class BenzFactory:CarFactory{    public override Car CreateCarFactory()    {        return new Benz();    }}//BMW制造工厂,只负责制造BMWpublic class BMWFactory:CarFactory{    public override Car CreateCarFactory()    {        return new BMW();    }}

假设现在需要扩大产品线,生产丰田汽车,那么我们可以看出,抽象工厂类不需要做任何改变,只要添加一个丰田类和丰田汽车工厂类就可以了,代码如下:

public class Crown:Car{    public Crown(){    }    public override void Print()    {        Console.WriteLine("This is Crown!\n");    }}public class CrownFactory:CarFactory{    public override Car CreateCarFactory()    {        return new Crown();    }}

什么时候应该使用工厂方法

  1. 类不能预测它必须创建哪一种类型的对象(汽车总部不知道顾客需要什么车)
  2. 类使用它的子类来制定来制定它要创建的对象(丰田工厂负责生产丰田汽车)
  3. 希望只有局部知晓那个类会被创建。
0 0
原创粉丝点击