抽象工廠模式(Abstract Factory)
1.適用環境
(主要是用在生產製造多種產品,軟件有多種皮膚,多種數據庫等環境)
- 一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
- 系統中有多於一個的產品族,而每次只使用其中某一產品族。
- 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
- 系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現
2.模式定義
抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。
3.模式結構
抽象工廠模式包含如下角色:
- AbstractFactory:抽象工廠
- ConcreteFactory:具體工廠
- AbstractProduct:抽象產品
- Product:具體產品
爲了更清晰地理解工廠方法模式,需要先引入兩個概念:
- 產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
- 產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。
4.代碼
流程接口
interface IFlow
{
IRxAlign CreateRxAlign();
IDispensing CreateDispensing();
}
class FlowA : IFlow
{
public IRxAlign CreateRxAlign()
{
return new RxAlignA();
}
public IDispensing CreateDispensing()
{
return new DispensingA();
}
}
class FlowB : IFlow
{
public IRxAlign CreateRxAlign()
{
return new RxAlignB();
}
public IDispensing CreateDispensing()
{
return new DispensingB();
}
}
耦合接口
interface IRxAlign
{
event LocationChange LocChange;
int[] RoPulse { set; get; }
int[] FiPulse { set; get; }
int[] RoMaxStep { set; get; }
double[] RoRESTarget { set; get; }
double[] TxP { set; get; }
double[] RESmin { set; get; }
double[] RESmax { set; get; }
Coordinate Location { set; get; }
void LoadPara(string PN);
void GoHome();
void Start();
void Stop();
}
class RxAlignA : IRxAlign
{
private ControlCard card;
private QSFP28 product;
private double RESmax, RESmin, RES;
private double[] TxPower;
public RxAlignA()
{
this.RESmax = 1.0;
this.RESmin = 0.4;
}
public bool ConfigPara()
{
try
{
this.card = new ControlCard();
this.product = new QSFP28();
return true;
}
catch
{
return false;
}
}
public void GoHome()
{
//QSFP28 go home
}
public void Start()
{
//QSFP28 start
}
public void Stop()
{
card = null;
product = null;
}
...
}
class RxAlignB : IRxAlign
{
private ControlCard card;
private CFP4 product;
private double RESmax, RESmin, RES;
private double[] TxPower;
public RxAlignB()
{
this.RESmax = 1.0;
this.RESmin = 0.4;
}
public bool ConfigPara()
{
try
{
this.card = new ControlCard();
this.product = new CFP4();
return true;
}
catch
{
return false;
}
}
public void GoHome()
{
//CFP4 go home
}
public void Start()
{
//CFP4 start
}
public void Stop()
{
card = null;
product = null;
}
...
}
點膠接口
interface IDispensing
{
//code
}
class DispensingA : IDispensing
{
//code
}
class DispensingB : IDispensing
{
//code
}
主線程調用
flow = new FlowA();
align = flow.CreateRxAlign();
align.LoadPara(this.comboBoxPN.Text);
dispens = flow.CreateDispensing();
dispens.//code
...
[轉自]
http://design-patterns.readthedocs.org/zh_CN/latest/creational_patterns/abstract_factory.html