一、什麼是抽象工廠模式 抽象工廠模式的用意為:給客戶端提供一個介面,可以創建多個產品族中的產品對象 ,而且使用抽象工廠模式還要滿足以下條件: 產品族:位於不同產品等級結構中,功能相關聯的產品組成的家族。下麵例子的 汽車和空調就是兩個產品樹, 賓士C200+格力某型號空調就是一個產品族, 同理, 奧迪 ...
一、什麼是抽象工廠模式
抽象工廠模式的用意為:給客戶端提供一個介面,可以創建多個產品族中的產品對象 ,而且使用抽象工廠模式還要滿足以下條件:
- 系統中有多個產品族,而系統一次只可能消費其中一族產品。
- 同屬於同一個產品族的產品可以使用。
產品族:位於不同產品等級結構中,功能相關聯的產品組成的家族。下麵例子的 汽車和空調就是兩個產品樹, 賓士C200+格力某型號空調就是一個產品族, 同理, 奧迪A4+海爾某型號空調也是一個產品族。
二、類圖
三、抽象工廠模式的組成
- 抽象工廠(AbstractFactory):確定工廠的業務範圍。
- 具體工廠(ConcreteFactory):每個具體工廠對應一個產品族。具體工廠決定生產哪個具體產品對象。
- 抽象產品(AbstractProduct):同一產品等級結構的抽象類。
- 具體產品(ConcreteProduct):可供生產的具體產品。
產品類:
<?php // 汽車(抽象產品介面) interface AutoProduct { public function dirve(); } //奧迪A4(具體產品類) class AudiA4Product implements AutoProduct { //獲取汽車名稱 public function dirve() { echo "開奧迪A4"."<br>"; } } //賓士C200(具體產品類) class BenzC200Product implements AutoProduct { //獲取汽車名稱 public function dirve() { echo "開賓士C200"."<br>"; } } ?>
<?php //空調(抽象產品介面) interface AirCondition { public function blow(); } //格力空調某型號(具體產品類) class GreeAirCondition implements AirCondition { public function blow() { echo "吹格力空調某型號"."<br>"; } } //海爾空調某型號(具體產品類) class HaierAirCondition implements AirCondition { public function blow() { echo "吹海爾空調某型號"."<br>"; } } ?>
工廠類:
<?php //工廠介面 interface Factory { public function getAuto(); public function getAirCondition(); } //工廠A = 奧迪A4 + 海爾空調某型號 class AFactory implements Factory { //汽車 public function getAuto() { return new AudiA4Product(); } //空調 public function getAirCondition() { return new HaierAirCondition(); } } ?>
<?php //工廠B = 賓士C200 + 格力空調某型號 class BFactory implements Factory { //汽車 public function getAuto() { return new BenzC200Product(); } //空調 public function getAirCondition() { return new GreeAirCondition(); } } ?>
客戶端測試:
<?php //客戶端測試代碼 $factoryA = new AFactory(); $factoryB = new BFactory(); //A工廠製作車 $auto_carA = $factoryA->getAuto(); $auto_airA = $factoryA->getAirCondition(); //B工廠製作車 $auto_carB = $factoryB->getAuto(); $auto_airB = $factoryB->getAirCondition(); //開奧迪車+吹海爾空調 $auto_carA->dirve(); $auto_airA->blow(); //熱的時候可以吹吹空調 //開賓士車+吹格力空調; $auto_carB->dirve(); $auto_airB->blow(); //熱的時候可以吹吹空調 ?>
工廠方法模式:
- 一個抽象產品類,可以派生出多個具體產品類。
- 一個抽象工廠類,可以派生出多個具體工廠類。
- 每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:
- 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
- 一個抽象工廠類,可以派生出多個具體工廠類。
- 每個具體工廠類可以創建多個具體產品類的實例。
簡單工廠 : 用來生產同一等級結構中的任意產品。(對於增加新的產品,無能為力)
工廠方法 :用來生產同一等級結構中的固定產品。(支持增加任意產品)
抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能為力;支持增加產品族)
如果有什麼疑問或者講錯的地方,歡迎大家留言。