简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
/// <summary>
/// 抽象产品基类
/// </summary>
public abstract class Food
{
public abstract void Print();
}
/// <summary>
/// 西红柿
/// </summary>
public class Tomato : Food
{
public Tomato() {
this.Print();
}
/// <summary>
/// 继承抽象基类,必须实现的方法
/// </summary>
public override void Print()
{
Console.WriteLine("西红柿");
}
}
/// <summary>
/// 土豆
/// </summary>
public class Potatoes : Food
{
public Potatoes() {
this.Print();
}
public override void Print()
{
Console.WriteLine("土豆");
}
}
/// <summary>
/// 工厂基类 有一个产生方法,返回一个产品类
/// </summary>
public abstract class Creator {
public abstract Food CreateFoodFactory();
}
/// <summary>
/// 西红柿工厂
/// </summary>
public class TomatoFactory : Creator
{
/// <summary>
/// 产生西红柿
/// </summary>
/// <returns></returns>
public override Food CreateFoodFactory()
{
return new Tomato();
}
}
public class PotatoesFactory:Creator{
public override Food CreateFoodFactory()
{
return new Potatoes();
}
}
}
测试实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class Program
{
static void Main(string[] args)
{
//创建2个工厂
Creator potatoesFactory = new PotatoesFactory();
Creator tomatoFactory = new TomatoFactory();
//生产对应的产品
Food potatoes = potatoesFactory.CreateFoodFactory();
Food tomatoegg = tomatoFactory.CreateFoodFactory();
Console.Read();
}
}
}
工厂模式中各类之间的UML图:
从UML图可以看出,在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:
Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类
TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品
Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类
TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。