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

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

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

一个例子

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制造工厂,只负责制造Benz
public class BenzFactory:CarFactory
{
    public override Car CreateCarFactory()
    {
        return new Benz();
    }
}


//BMW制造工厂,只负责制造BMW
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值