设计模式学习(三)——工厂方法模式
在前一篇文章中,谈到了简单工厂模式的缺点,就是它难以扩展,一旦添加新的产品就不得不修改工厂的逻辑。
工厂方法模式就是为了解决这个问题而产生的。与简单工厂模式不同的是,它将具体产品的制造放到了子类中,此时它不再负责生产具体的产品,而只是给出具体工厂必须实现的一个接口。
一个例子
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();
}
}
什么时候应该使用工厂方法
- 类不能预测它必须创建哪一种类型的对象(汽车总部不知道顾客需要什么车)
- 类使用它的子类来制定来制定它要创建的对象(丰田工厂负责生产丰田汽车)
- 希望只有局部知晓那个类会被创建。