PHP設計模式(三)抽象工廠模式(Abstract Factory)

1、什麼是抽象工廠模式

抽象工廠模式的用意爲:給客戶端提供一個接口,能夠建立多個產品族中的產品對象 ,並且使用抽象工廠模式還要知足如下條件:php

  1. 系統中有多個產品族,而系統一次只可能消費其中一族產品。
  2. 同屬於同一個產品族的產品能夠使用。

產品族:位於不一樣產品等級結構中,功能相關聯的產品組成的家族。下面例子的 汽車和空調就是兩個產品樹, 奔馳C200+格力某型號空調就是一個產品族, 同理, 奧迪A4+海爾某型號空調也是一個產品族。segmentfault

2、類圖

圖片描述

3、案例

產品類
// 汽車(抽象產品接口)
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>";
    }
}
//空調(抽象產品接口)
interface AirCondition
{
    public function blow();
}

//格力空調某型號(具體產品類)
class GreeAirCondition implements AirCondition
{
    public function blow()
    {
        echo "吹格力空調某型號"."<br>";
    }
}

//海爾空調某型號(具體產品類)
class HaierAirCondition implements AirCondition
{
    public function blow()
    {
        echo "吹海爾空調某型號"."<br>";
    }
}
工廠類
//工廠接口
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();
    }
}
//工廠B = 奔馳C200 + 格力空調某型號
class BFactory implements Factory
{
    //汽車
    public function getAuto()
    {
        return new BenzC200Product();
    }

    //空調
    public function getAirCondition()
    {
        return new GreeAirCondition();
    }
}
客戶端類
//客戶端測試代碼
$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(); //熱的時候能夠吹吹空調

4、抽象工廠模式的組成

  1. 抽象工廠(AbstractFactory):肯定工廠的業務範圍。
  2. 具體工廠(ConcreteFactory):每一個具體工廠對應一個產品族。具體工廠決定生產哪一個具體產品對象。
  3. 抽象產品(AbstractProduct):同一產品等級結構的抽象類。
  4. 具體產品(ConcreteProduct):可供生產的具體產品。

工廠方法模式:

  • 一個抽象產品類,能夠派生出多個具體產品類。
  • 一個抽象工廠類,能夠派生出多個具體工廠類。
  • 每一個具體工廠類只能建立一個具體產品類的實例。

抽象工廠模式:

  • 多個抽象產品類,每一個抽象產品類能夠派生出多個具體產品類。
  • 一個抽象工廠類,能夠派生出多個具體工廠類。
  • 每一個具體工廠類能夠建立多個具體產品類的實例。設計模式

    三種工廠的比較

  • 簡單工廠 :用來生產同一等級結構中的任意產品。(對於增長新的產品,無能爲力)
  • 工廠方法 :用來生產同一等級結構中的固定產品。(支持增長任意產品)
  • 抽象工廠 :用來生產不一樣產品族的所有產品。(對於增長新的產品,無能爲力;支持增長產品族)

參考

系列源地址

WilburXu/design_pattern測試

系列目錄

  1. PHP 設計模式概述
  2. PHP設計模式(一)簡單工廠模式 (Simple Factory For PHP)
  3. PHP設計模式(二)工廠方法模式(Factory Method)
  4. PHP設計模式(三)抽象工廠模式(Abstract Factory)
  5. PHP設計模式(四)單例模式(Singleton)
相關文章
相關標籤/搜索