1.適用環境
(主要是用在生產製造多種產品,軟體有多種皮膚,多種資料庫等環境)
一個系統不應依賴產品類實例如何被創建、組合和表達的細節,這對於所有類型的工廠模式都是重要的。
系統中有多於一個的產品族,而每次只使用其中某一產品族。
屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
系統提供一個產品類別的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現
2.模式定義
抽象工廠模式(Abstract Factory Pattern
2.模式定義抽象工廠模式(Abstract Factory Pattern2.模式定義
為了更清楚地理解工廠方法模式,需要先引入兩個概念:
產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類別是電視機,其子類別有海爾電視機、海信電視機、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...