PHP簡單工廠、工廠方法和抽象工廠對比

https://www.phpmianshi.com/?id=47

 

PHP工廠模式概念:工廠模式是一種類,它具有爲您創建對象的某些方法。您可以使用工廠類創建對象,而不直接使用 new。這樣,如果您想要更改所創建的對象類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。
根據抽象程度不同,php工廠模式分爲:簡單工廠模式、工廠方法模式和抽象工廠模式

簡單工廠模式:

 

/**
 *簡單工廠模式與工廠方法模式比較。
 *簡單工廠又叫靜態工廠方法模式,這樣理解可以確定,簡單工廠模式是通過一個靜態方法創建對象的。 
 */
interface  people {
    function  jiehun();
}
class man implements people{
    function jiehun() {
        echo '送玫瑰,送戒指!<br>';
    }
}
  
class women implements people {
    function jiehun() {
        echo '穿婚紗!<br>';
    }
}
  
class SimpleFactoty {
    // 簡單工廠裏的靜態方法
    static function createMan() {
        return new     man;
    }
    static function createWomen() {
        return new     women;
    }
     
}
  
$man = SimpleFactoty::createMan();
$man->jiehun();
$man = SimpleFactoty::createWomen();
$man->jiehun();

 

  工廠方法模式:

<?php
/*
 *工廠方法模式:
 *定義一個創建對象的接口,讓子類決定哪個類實例化。 他可以解決簡單工廠模式中的封閉開放原則問題。<www.phpddt.com整理>
 */
interface  people {
    function  jiehun();
}
class man implements people{
    function jiehun() {
        echo '送玫瑰,送戒指!<br>';
    }
}
  class women implements people {
    function jiehun() {
        echo '穿婚紗!<br>';
    }
}
  interface  createMan {  // 注意了,這裏是簡單工廠本質區別所在,將對象的創建抽象成一個接口。
    function create();
  }
class FactoryMan implements createMan{
    function create() {
        return  new man;
    }
}
class FactoryWomen implements createMan {
    function create() {
        return new women;
    }
}
  class  Client {
    // 簡單工廠裏的靜態方法
    function test() {
        $Factory =  new  FactoryMan;
        $man = $Factory->create();
        $man->jiehun();
                 $Factory =  new  FactoryWomen;
        $man = $Factory->create();
        $man->jiehun();
    }
}
  $f = new Client;
$f->test();

 

  抽象工廠模式:

<?php
/*
抽象工廠:提供一個創建一系列相關或相互依賴對象的接口。
注意:這裏和工廠方法的區別是:一系列,而工廠方法則是一個。
那麼,我們是否就可以想到在接口create裏再增加創建“一系列”對象的方法呢?
*/
interface  people {
    function  jiehun();
}
class Oman implements people{
    function jiehun() {
        echo '美女,我送你玫瑰和戒指!<br>';
    }
}
class Iman implements people{
    function jiehun() {
        echo '我偷偷喜歡你<br>';
    }
}
  class Owomen implements people {
    function jiehun() {
        echo '我要穿婚紗!<br>';
    }
}
  class Iwomen implements people {
    function jiehun() {
        echo '我好害羞哦!!<br>';
    }
}
  interface  createMan {  // 注意了,這裏是本質區別所在,將對象的創建抽象成一個接口。
    function createOpen(); //分爲 內斂的和外向的
    function createIntro(); //內向
  }
class FactoryMan implements createMan{
    function createOpen() {
        return  new  Oman;
    }
    function createIntro() {
        return  new Iman;
    }
}
class FactoryWomen implements createMan {
    function createOpen() {
        return  new  Owomen;
    }
    function createIntro() {
        return  new Iwomen;
    }
}
  class  Client {
    // 簡單工廠裏的靜態方法
    function test() {
        $Factory =  new  FactoryMan;
        $man = $Factory->createOpen();
        $man->jiehun();
                 $man = $Factory->createIntro();
        $man->jiehun();
                          $Factory =  new  FactoryWomen;
        $man = $Factory->createOpen();
        $man->jiehun();
                 $man = $Factory->createIntro();
        $man->jiehun();
             }
}
  $f = new Client;
$f->test();

  

區別:

簡單工廠模式:用來生產同一等級結構中的任意產品。對於增加新的產品,無能爲力

違反了開閉原則,對修改封閉,對擴展開放,新增產品都要修改工廠

 

工廠模式 :用來生產同一等級結構中的固定產品。解決了簡單工廠新增產品需要修改工廠的問題,支持增加任意產品,不修改原有工廠

 

抽象工廠 :用來生產不同產品族的全部產品。(對於增加新的產品,無能爲力;支持增加產品族)  

以上三種工廠 方法在等級結構和產品族這兩個方向上的支持程度不同。所以要根據情況考慮應該使用哪種方法

適用範圍:

簡單工廠模式:

工廠類負責創建的對象較少,客戶只知道傳入工廠類的參數,對於如何創建對象不關心。

工廠方法模式:

當一個類不知道它所必須創建對象的類或一個類希望由子類來指定它所創建的對象時,當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候,可以使用工廠方法模式。

抽象工廠模式:

一個系統不應當依賴於產品類實例何如被創建,組合和表達的細節,這對於所有形態的工廠模式都是重要的。這個系統有多於一個的產品族,而系統只消費其 中某一產品族。同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。系統提供一個產品類的庫,所有的產品以同樣的接口出現,從 而使客戶端不依賴於實現。

無論是簡單工廠模式、工廠模式還是抽象工廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留作接口,以達到最大程度上的複用。究竟用哪種設計模式更適合,這要根據具體的業務需求來決定。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章