意图/定义:定义一个用于创建对象(产品)的(工厂)接口,让子类(具体工厂)决定实例化哪一个类(产品)。将实例化推迟到子类。
问题:一个类需要实例化另一个类的子类,但不知道是哪一个。工厂方法允许子类进行决策。
解决方案:让派生类对实例化哪个类和如何实例化类进行决策
参与者与协作者:Produect是工厂所要创建的类型的接口。而Creator是定义工厂的接口。
效果:客户需要继承Creator以创建一个特定的具体工厂以生产具体产品。
实现:在抽象类中使用一个抽象方法。需要实例化一个被包含对象时,抽象类的代码引用此方法,但是不知道需要的对象是哪个。
下面以不同的人去KFC或者去McDonald吃快餐为例来说明工厂方法的使用,因为KFC和MD都生产自己的薯条,但各有特色。一个人可能根据自己的喜好,决定点哪家的薯条。
using System;
namespace FactoryMethod
{
/// <summary>
/// MainApp startup class for Structural
/// Factory Method Design Pattern.
/// </summary>
class MainApp
{
/// <summary>
/// Entry point into console application.
/// </summary>
static void Main()
{
// An array of creators
Creator[] creators = new Creator[2];
creators[0] = new KFC_Creator();
creators[1] = new MD_Creator();
// Iterate over creators and create products
foreach (Creator creator in creators)
{
Product product = creator.FactoryMethod();
Console.WriteLine("Created {0}",product.GetType().Name);
}
// Wait for user
Console.ReadKey();
}
}
/// <summary>
/// The 'Product' abstract class
/// </summary>
abstract class Product
{
}
/// <summary>
/// A 'ConcreteProduct' class
/// </summary>
class KFC_Chips : Product
{
}
/// <summary>
/// A 'ConcreteProduct' class
/// </summary>
class MD_Chips : Product
{
}
/// <summary>
/// The 'Creator' abstract class
/// </summary>
abstract class Creator
{
public abstract Product FactoryMethod();
}
/// <summary>
/// A 'ConcreteCreator' class
/// </summary>
class KFC_Creator : Creator
{
public override Product FactoryMethod()
{
return new KFC_Chips();
}
}
/// <summary>
/// A 'ConcreteCreator' class
/// </summary>
class MD_Creator : Creator
{
public override Product FactoryMethod()
{
return new MD_Chips();
}
}
}