為了對一個類進行執行個體化,通常使用這個類的構成函數,但是有時候出現這類情況:幾個類實現了同一個介面,具有同樣的操作、返回了同樣的抽象類別型,不知道該為哪個類型建立對象,因為需要根據條件來控制對哪個類進行執行個體化,並且此時類的數量可能增減,介面卻是穩定的。我們需要Factory 方法模式!
我們遇見一個.NET中的經典執行個體就是列舉程式。Enumerator的 GetEnumerator()的方法是一個用了Factory 方法模式的例子。這個方法將調用者與需要進行執行個體化的類隔離開來了。
需要指出的是並不是能夠建立並返回一個對象的方法都是Factory 方法。Factory 方法模式需要包括一個方法,這個方法建立並返回一個對象,同時客戶無需要瞭解應該具體去執行個體化哪個類。
我們再看另外一個例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace FactoryMethod
...{
/**//// <summary>
/// 機器
/// </summary>
public abstract class Machine
...{
public abstract void Print();
}
/**///// <summary>
/// 印表機
/// </summary>
public class Printer : Machine
...{
public override void Print()
...{
Console.WriteLine("Printer");
}
}
/**///// <summary>
/// 複印機
/// </summary>
public class Copycat : Machine
...{
public override void Print()
...{
Console.WriteLine("Copycat");
}
}
/**//// <summary>
/// MachineFactory 類
/// </summary>
public abstract class MachineFactory
...{
public abstract Machine Create();
}
/**//// <summary>
/// PrinterFactory 類
/// </summary>
public class PrinterFactory : MachineFactory
...{
public override Machine Create()
...{
return new Printer();
}
}
/**//// <summary>
/// CopycatFactory 類
/// </summary>
public class CopycatFactory : MachineFactory
...{
public override Machine Create()
...{
return new Copycat();
}
}
class Program
...{
static void Main(string[] args)
...{
MachineFactory factory = null;
//根據條件判斷建立哪個對象
bool conditon = true;
if (conditon)
...{
factory = new PrinterFactory();
}
else
...{
factory = new CopycatFactory();
}
Machine machine = factory.Create();
machine.Print();
Console.ReadLine();
}
}
}