動機:實現一系列相互依賴對象的建立,通過封裝系列對象建立來隔離對象建立和客戶程式,從而能夠靈活提供更多系列對象建立和系列對象間的切換,而不需要改變客戶程式。
應用:多種風格軟體介面控制項的建立、對應多種資料庫的多系列資料訪問層對象的建立(比如Petshop中的資料訪問層對象)。
情境:此處以ThinkPad系列產品的組裝為例子。組裝電腦程式(即客戶)需要根據需要拿出不同系列ThinkPad(此處以T43和T60為例)組件(以CPU和主板為例)組裝成ThinkPad。因為T43和T60的CPU系列介面不同,所以同一系列中的CPU和主板相互依賴,每次只能拿同一系列的CPU和主板進行組裝。
Factory Method模式:Factory Method模式是Abstract Factory模式的特殊形式,它實現一個對象的建立,而Abstract Factory模式實現系列對象建立。如這裡只涉及到多種CPU的建立,則變為了Factory Method模式。
結構
代碼實現
/**//*
* 產品CPU
*/
namespace DesignPattern.AbstractFactory
{
public abstract class CPU
{
}
public class T43CPU : CPU
{
}
public class T60CPU : CPU
{
}
}
/**//*
* 產品主板
*/
namespace DesignPattern.AbstractFactory
{
public abstract class Mainboard
{
}
public class T43Mainboard : Mainboard
{
}
public class T60Mainboard : Mainboard
{
}
}
/**//*
* 不同ThinkPad系列相互依賴組件組成不同型號ThinkPad,此處忽略各種不同型號。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPad
{
public void Play()
{
}
}
}
/**//*
* ThinkPad工廠,生產各型號ThinkPad組件
*/
namespace DesignPattern.AbstractFactory
{
public abstract class ThinkPadFactory
{
public abstract CPU CreateCPU();
public abstract Mainboard CreateMainboard();
}
public class T43Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T43CPU();
}
public override Mainboard CreateMainboard()
{
return new T43Mainboard();
}
}
public class T60Factory : ThinkPadFactory
{
public override CPU CreateCPU()
{
return new T60CPU();
}
public override Mainboard CreateMainboard()
{
return new T60Mainboard();
}
}
}
/**//*
* 客戶程式,從ThinkPad工廠中拿出所需系列組件進行組裝。
*/
namespace DesignPattern.AbstractFactory
{
public class ThinkPadAssembly
{
public static readonly ThinkPadAssembly Instanse = new ThinkPadAssembly();
public ThinkPad CreateThinkPad(string strThinkPadName)
{
ThinkPadFactory thinkPadFactory = (ThinkPadFactory)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance("DesignPattern.AbstractFactory" + "." + strThinkPadName + "Factory");
CPU cpu = thinkPadFactory.CreateCPU();
Mainboard mainboard = thinkPadFactory.CreateMainboard();
return Assemble(cpu, mainboard);
}
private ThinkPad Assemble(CPU cpu, Mainboard mainboard)
{
// 組裝並返回ThinkPad,此處簡化各種型號的ThinkPad
return new ThinkPad();
}
}
}