转载:Learning hard
工厂模式:定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类工厂当中
代码:
namespace ConsoleApplication1
{
//菜的抽象类
public abstract class Food
{
public abstract void Print();
}
//西红柿炒鸡蛋
public class TomatoScrambledEggs : Food
{
public override void Print()
{
Console.WriteLine("西红柿炒鸡蛋好了");
}
}
//土豆肉这道菜
public class ShreddedPorkWithPotatoes : Food
{
public override void Print()
{
Console.WriteLine("土豆肉这道菜好了");
}
}
//抽象工厂类
public abstract class Creator
{
//工厂方法
public abstract Food CreateFoodFactory();
}
public class TomatoScrambledEggsFactory : Creator
{
//负责创建西红柿炒蛋这道菜
public override Food CreateFoodFactory()
{
return new TomatoScrambledEggs();
}
}
public class ShreddedPorkWithPotatoesFactory : Creator
{
//负责创建土豆肉这道菜
public override Food CreateFoodFactory()
{
return new ShreddedPorkWithPotatoes();
}
}
public class Program
{
static void Main()
{
//初始化做菜的两个工厂
Creator shreddedPorkWithPotatoeFactory = new ShreddedPorkWithPotatoesFactory();
Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
//开始做西红柿炒蛋
Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoodFactory();
tomatoScrambleEggs.Print();
//开始做土豆肉
Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoeFactory.CreateFoodFactory();
shreddedPorkWithPotatoes.Print();
Console.ReadKey();
}
}
}
在此基础上增加新产品:
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类和肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现
/// <summary>
/// 肉末茄子这道菜
/// </summary>
public class MincedMeatEggplant : Food
{
/// <summary>
/// 重写抽象类中的方法
/// </summary>
public override void Print()
{
Console.WriteLine("肉末茄子好了");
}
}
/// <summary>
/// 肉末茄子工厂类,负责创建肉末茄子这道菜
/// </summary>
public class MincedMeatEggplantFactory : Creator
{
/// <summary>
/// 负责创建肉末茄子这道菜
/// </summary>
/// <returns></returns>
public override Food CreateFoddFactory()
{
return new MincedMeatEggplant();
}
}
/// <summary>
/// 客户端调用
/// </summary>
class Client
{
static void Main(string[] args)
{
// 如果客户又想点肉末茄子了
// 再另外初始化一个肉末茄子工厂
Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();
// 利用肉末茄子工厂来创建肉末茄子这道菜
Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();
minceMeatEggplant.Print();
Console.Read();
}
}