在简单工厂模式 中了解到简单工厂模式的缺点,下面就具体看看工厂模式是如何解决该问题的。工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。下面看下工厂模式的具体实现代码(这里还是以简单工厂模式中点菜的例子来实现):
新建一个 Food 类:
namespace Example.Models
{
public abstract class Food
{
public abstract string Print();
}
public class Tomato : Food
{
public override string Print()
{
return "Tomato烧好了";
}
}
public class Beaf : Food
{
public override string Print()
{
return "beaf烧好了";
}
}
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Creator
{
public abstract Food CreatFoodFactory();
}
public class TomatoFactory : Creator
{
public override Food CreatFoodFactory()
{
return new Tomato();
}
}
public class BeafFactory : Creator
{
public override Food CreatFoodFactory()
{
return new Beaf();
}
}
}
在aspx中实现:
protected void Page_Load(object sender, EventArgs e)
{
// 初始化做菜的两个工厂()
Creator beafFactory = new BeafFactory();
Creator tomatoFactory = new TomatoFactory();
//开始做西红柿
Food tomato = tomatoFactory.CreatFoodFactory();
Response.Write(tomato.Print());
// 开始做肉丝
Food beaf = beafFactory.CreatFoodFactory();
Response.Write(beaf.Print());
}
效果如下:
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想点一个猪脚,此时我们只需要定义一个猪脚具体工厂类和猪脚类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:
namespace Example.Models
{
public abstract class Food
{
public abstract string Print();
}
public class Tomato : Food
{
public override string Print()
{
return "Tomato烧好了";
}
}
public class Beaf : Food
{
public override string Print()
{
return "beaf烧好了";
}
}
public class Pigfoot : Food
{
public override string Print()
{
return "猪脚烧好了";
}
}
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Creator
{
public abstract Food CreatFoodFactory();
}
public class TomatoFactory : Creator
{
public override Food CreatFoodFactory()
{
return new Tomato();
}
}
public class BeafFactory : Creator
{
public override Food CreatFoodFactory()
{
return new Beaf();
}
}
public class PigfootFactory : Creator
{
public override Food CreatFoodFactory()
{
return new Pigfoot();
}
}
}
aspx 端调用如下:
protected void Page_Load(object sender, EventArgs e)
{
// 初始化做菜的两个工厂()
Creator beafFactory = new BeafFactory();
Creator tomatoFactory = new TomatoFactory();
Creator pigfootFactory = new PigfootFactory();
//开始做西红柿炒蛋
Food tomato = tomatoFactory.CreatFoodFactory();
Response.Write(tomato.Print());
// 开始做土豆肉丝
Food beaf = beafFactory.CreatFoodFactory();
Response.Write(beaf.Print());
//开始做猪脚
Food pigfoot = pigfootFactory.CreatFoodFactory();
Response.Write(pigfoot.Print());
}
效果如下: