工厂方法模式比喻
请女生去麦当劳吃汉堡,不同的女生有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method-工厂方法模式,带着女孩到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让女生直接跟服务员说就行了。
工厂方法模式意图
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式类图

工厂方法模式实现
/// <summary>
/// 工厂方法模式中,提供不同的女孩不同的口味的汉堡,相当于我的职责
/// </summary>
interface IGirl
{
IHamburg DemandHamburg();
}
/// 工厂方法模式中,提供不同的女孩不同的口味的汉堡,相当于我的职责
/// </summary>
interface IGirl
{
IHamburg DemandHamburg();
}
/// <summary>
/// 喜欢吃第一种汉堡的女孩
/// </summary>
class Girl1 : IGirl
{
public IHamburg DemandHamburg()
{
return new Hamburg1();
}
}
/// 喜欢吃第一种汉堡的女孩
/// </summary>
class Girl1 : IGirl
{
public IHamburg DemandHamburg()
{
return new Hamburg1();
}
}
/// <summary>
/// 喜欢吃第二种汉堡的女孩
/// </summary>
class Girl2 : IGirl
{
public IHamburg DemandHamburg()
{
return new Hamburg2();
}
}
/// 喜欢吃第二种汉堡的女孩
/// </summary>
class Girl2 : IGirl
{
public IHamburg DemandHamburg()
{
return new Hamburg2();
}
}
/// <summary>
/// 不同口味汉堡的抽象
/// </summary>
interface IHamburg
{
void ImproveHamburg();
}
/// 不同口味汉堡的抽象
/// </summary>
interface IHamburg
{
void ImproveHamburg();
}
/// <summary>
/// 第一种口味汉堡
/// </summary>
class Hamburg1 : IHamburg
{
public void ImproveHamburg()
{
Console.WriteLine("提供第一种口味女孩的汉堡");
}
}
/// 第一种口味汉堡
/// </summary>
class Hamburg1 : IHamburg
{
public void ImproveHamburg()
{
Console.WriteLine("提供第一种口味女孩的汉堡");
}
}
/// <summary>
/// 第二种口味汉堡
/// </summary>
class Hamburg2 : IHamburg
{
public void ImproveHamburg()
{
Console.WriteLine("提供第二种口味女孩的汉堡");
}
}
/// 第二种口味汉堡
/// </summary>
class Hamburg2 : IHamburg
{
public void ImproveHamburg()
{
Console.WriteLine("提供第二种口味女孩的汉堡");
}
}
/// <summary>
/// 工厂方法模式客户端应用
/// </summary>
class Program
{
static void Main(string[] args)
{
//喜欢第一种口味汉堡的女孩子
IGirl girl = new Girl1();
/// 工厂方法模式客户端应用
/// </summary>
class Program
{
static void Main(string[] args)
{
//喜欢第一种口味汉堡的女孩子
IGirl girl = new Girl1();
//提供女生喜欢的汉堡
IHamburg hamburg=girl.DemandHamburg();
hamburg.ImproveHamburg();
IHamburg hamburg=girl.DemandHamburg();
hamburg.ImproveHamburg();
Console.Read();
}
}
}
}
工厂方法模式总结
我不再负责记住每个女孩想吃什么口味的汉堡了,而是将每个女孩想吃什么口味的汉堡交给她们自己去做。即系统中的核心工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类,核心工厂类仅仅负责给出具体工厂类实现的接口,成为一个抽象工厂角色,而不接触哪一个产品类应当被实例化的细节。