天天看點

php設計模式-抽象工廠模式

提供一個建立一系列相關或互相依賴對象的接口。

注意:這裡和工廠方法的差別是:一系列(多個),而工廠方法隻有一個。

<?php
header('Content-type:text/html;charset=utf-8');
/*
 * 抽象工廠模式
 */

/**
 * Interface people 人類
 */
interface  people
{
    public function  say();
}

/**
 * Class OneMan 第一個男人類-繼承people
 */
class OneMan implements people
{
    // 實作people的say方法
    public function say()
    {
        echo '男1:我喜歡你<br>';
    }
}

/**
 * Class TwoMan 第二個男人類-繼承people
 */
class TwoMan implements people{
    // 實作people的say方法
    public function say()
    {
        echo '男2:我看上你了<br>';
    }
}

/**
 * Class OneWomen 第一個女人類-繼承people
 */
class OneWomen implements people {
    // 實作people的say方法
    public function say()
    {
        echo '女1:我不喜歡你<br>';
    }
}

/**
 * Class TwoWomen 第二個女人類-繼承people
 */
class TwoWomen implements people {
    // 實作people的say方法
    public function say()
    {
        echo '女2:滾一邊玩去<br>';
    }
}

/**
 * Interface createPeople 建立對象類
 * 注意:這裡将對象的建立抽象成了一個接口。
 */
interface  createPeople
{
    // 建立第一個
    public function createOne();
    // 建立第二個
    public function createTwo();

}

/**
 * Class FactoryMan 用于建立男人對象的工廠類-繼承createPeople
 */
class FactoryMan implements createPeople
{
    // 建立第一個男人
    public function createOne()
    {
        return new OneMan();
    }

    // 建立第二個男人
    public function createTwo()
    {
        return new TwoMan();
    }
}

/**
 * Class FactoryWomen 用于建立女人對象的工廠類-繼承createPeople
 */
class FactoryWomen implements createPeople
{
    // 建立第一個女人
    public function createOne()
    {
        return new OneWomen();
    }

    // 建立第二個女人
    public function createTwo()
    {
        return new TwoWomen();
    }
}

/**
 * Class Client 執行測試類
 */
class  Client {

    // 具體生成對象和執行方法
    public function test() {
        // 男人
        $factory = new FactoryMan();
        $man = $factory->createOne();
        $man->say();

        $man = $factory->createTwo();
        $man->say();

        // 女人
        $factory = new FactoryWomen();
        $man = $factory->createOne();
        $man->say();

        $man = $factory->createTwo();
        $man->say();

    }
}

// 執行
$demo = new Client;
$demo->test();
           

結果:

男:我喜歡你
男:我看上你了
女:我不喜歡你
女:滾一邊玩去
           

差別

  1. 簡單工廠模式(靜态方法工廠模式) : 用來生産同一等級結構中的任意産品。(不能增加新的産品)
  2. 工廠模式 :用來生産同一等級結構中的固定産品。(支援增加任意産品)
  3. 抽象工廠 :用來生産不同産品種類的全部産品。(不能增加新的産品,支援增加産品種類)

适用範圍

簡單工廠模式:

工廠類負責建立的對象較少,操作時隻需知道傳入工廠類的參數即可,對于如何建立對象過程不用關心。

工廠方法模式:

滿足以下條件時,可以考慮使用工廠模式方法

  1. 當一個類不知道它所必須建立對象的類時
  2. 一個類希望由子類來指定它所建立的對象時
  3. 當類将建立對象的職責委托給多個幫助子類中得某一個,并且你希望将哪一個幫助子類是代理者這一資訊局部化的時

抽象工廠模式:

滿足以下條件時,可以考慮使用抽象工廠模式

  1. 系統不依賴于産品類執行個體如何被建立,組合和表達的細節。
  2. 系統的産品有多于一個的産品族,而系統隻消費其中某一族的産品
  3. 同屬于同一個産品族是在一起使用的。這一限制必須在系統的設計中展現出來。
  4. 系統提供一個産品類的庫,所有産品以同樣的接口出現,進而使用戶端不依賴于實作。

以上幾種,歸根結底,都是将重複的東西提取出來,以友善整體解耦和複用,修改時友善。可根據具體需求而選擇使用。

繼續閱讀