設計模式(3)之抽象原廠模式
來源:互聯網
上載者:User
抽象原廠模式是原廠模式的泛化版本,原廠模式是一種特殊的抽象原廠模式。在原廠模式中,每一個工廠只能生產一種具體的產品,而在抽象原廠模式中,每一個工廠可以生產多個具體的產品 名詞解釋: 1.產品等級:剷平等級結構即產品的繼承關係結構,比如 父類是抽象電視機類,有比如海爾電視機 海信電視機 等具體電視機子類。則抽象電視機於具體的電視機子類就構成了產品等級關係。 2.產品族:在抽象原廠模式中,產品族是指同一個工廠生產的,位於不同產品等級結構中的一組產品。比如 海爾電器工廠生產海爾冰箱 海爾洗衣機 這些產品雖屬於不同的產品等級介面,卻都是海爾工廠生產的,因為稱為一個產品族。 案列分析: 需求:一個電器工廠可以生產多種類型的電器,比如海爾工廠可以生產 海爾洗衣機 海爾並行 海信工廠可以生產海信電視機 海信冰箱,相同品牌的電器構成了一個產品族,而相同類型的產品構成了一個產品等級結構,現使用抽象原廠模式類比該情境. 虛擬碼: //抽象產品類television(電視),它可以是一個介面,也可以是一個抽象類別,其中包含生產電視機的方法play的聲明 public interface Television { public void play(); } //HaierTevision是Televison的子類,實現了父類Televison的play方法 public class HaierTelevision extends Telvision { public void play() { echo '我在生產海爾電視機'; } } //Haisence是Telvision的子類,HaierTelevison Television 和haisenceTelevision 構成了一個產品等級 public class HaisenceTelevison extens Telvision { public void play() { echo '我在生產海信電視機'; } } //抽象產品類icebox(冰箱),它可以是一個介面 也可是是一個抽象類別,裡面聲明了生產冰箱的方法produse public interface icebox { public void produce(); } //具體冰箱產品類HaierIcebox繼承了父類icebox,實現了父類的produce方法 public class HaierIcebox extends icebox { public void produce() { echo '我在生產海爾冰箱'; } } //具體產品類HaisenceIcebox繼承了父類icebox,與 icebox HaierIcebox 構成一個產品等級 public class HaisenceIcebox extends icebox { public void produce() { echo '我在生產海信冰箱'; } } //抽象工廠類efactory(電器工廠類) public interface efactory { //生產電視機,返回電視抽象類別對象 public Television produceTelevision(); //生產冰箱,返回冰箱抽象類別對象 public Icebox prodecuIcebox(); } //海爾具體工廠類,繼承父類efactory,實現父類中生產電視和冰箱的方法,海爾所生產的所有產品構成一個產品族 public class HaierFacetory extends efactory { //生產海爾電視 public Telvision produceTelevision() { return new HaierTelevision(); } //生產海爾冰箱 public icebox produceIcebox() { return new HaierIcebox(); } } //海信具體工廠類,繼承父類efactory,實現父類中生產電視盒冰箱的方法,海信所生產的所有產品構成一個產品族 public class HaisenceFactory extends efactory { public Telvision produceTelvision() { return new HaisenceTelevision(); } public icebox produceIcebox() { return new HaisenceIcebox(); } } efactory HaierFactory HaisenceFactory 構成了一個工廠等級結構 用戶端調用代碼: $factory = new Config::get('use_factory'); $tv = $factory->produceTelevision();//工廠建立對象 $tv->play();//生產電視機 $icebox = $factory->produceIcebox();//工廠建立對象 $icebox->produceIcebox();//生產冰箱 抽象工廠歐式的主要優點是隔離了具體類的產生,使得客戶並不需要知道什麼被建立,而且每次可以通過具體工廠類穿件一個產品族中的多個對象,增加或者替換產品族比較方便,增加新的具體工廠和新的產品族很方便;缺點在於增加新的產品等級結構很複雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支援呈傾斜性。 抽象原廠模式使用方式包括:一個系統不應當依賴於產品類執行個體如何被建立、組合和表達的細節;系統中有多餘一個的產品族,而每次只只用一個產品族;同屬於同一個產品族的產品將一起使用;系統中提供一個產品的類庫,所有的產品以同樣的介面出現,從而是用戶端不依賴於具體實現。