首頁  >  文章  >  後端開發  >  PHP簡單工廠模式、工廠方法模式與抽象工廠模式比較

PHP簡單工廠模式、工廠方法模式與抽象工廠模式比較

高洛峰
高洛峰原創
2017-03-18 10:49:331361瀏覽

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

簡單工廠模式:

/**
 *简单工厂模式与工厂方法模式比较。
 *简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。 
 */
interface  people {
    function  jiehun();
}
class man implements people{
    function jiehun() {
        echo &#39;送玫瑰,送戒指!<br>&#39;;
    }
}
 
class women implements people {
    function jiehun() {
        echo &#39;穿婚纱!<br>&#39;;
    }
}
 
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 &#39;送玫瑰,送戒指!<br>&#39;;
    }
}
 
class women implements people {
    function jiehun() {
        echo &#39;穿婚纱!<br>&#39;;
    }
}
 
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 &#39;美女,我送你玫瑰和戒指!<br>&#39;;
    }
}
class Iman implements people{
    function jiehun() {
        echo &#39;我偷偷喜欢你<br>&#39;;
    }
}
 
class Owomen implements people {
    function jiehun() {
        echo &#39;我要穿婚纱!<br>&#39;;
    }
}
 
class Iwomen implements people {
    function jiehun() {
        echo &#39;我好害羞哦!!<br>&#39;;
    }
}
 
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();

reee

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

工廠模式 :用來生產同一等級結構中的固定產品。 (支援增加任何產品)   
抽象工廠 :用來生產不同產品族的全部產品。 (增加新的產品,無能為力;支持增加產品族)  

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

適用範圍:

簡單工廠模式:

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

工廠方法模式:

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

抽象工廠模式:

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

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

更多PHP簡單工廠模式、工廠方法模式和抽象工廠模式比較相關文章請關注PHP中文網!

相關文章:

Java 實現抽象工廠模式的具體程式碼詳解

JAVA設計模式之抽象工廠模式

php物件開發——抽象工廠模式

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn