欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP設計模式中工廠模式深入詳解

 更新時間:2022年11月03日 14:39:47   作者:小松聊PHP進階  
工廠模式,是一種實例化對象的方式,只要輸入需要實例化對象的名字,就可以通過工廠對象的相應工廠函數(shù)來制造你需要的對象,工廠模式的最主要作用就是對象創(chuàng)建的封裝、簡化創(chuàng)建對象操作

簡介

工廠模式屬于創(chuàng)建型模式,可以分為三種:簡單工廠、工廠模式、抽象工廠。

通俗講就是用于如何優(yōu)雅的創(chuàng)建對象而設計。當開發(fā)者不知道建什么對象,或者創(chuàng)建方式過于復雜的時候去使用(比如引入一個大composer項目或大型sdk,有些時候確實不知道需要使用那些對象,此時就需要參考官方文檔,通過包里或sdk里提供的工廠方法,傳入指定參數(shù)去生成指定對象。比如easyWechat項目。),適用于具有服務端和調(diào)用端的場景,既能優(yōu)化調(diào)用端的使用體感,也能隱藏服務端創(chuàng)建對象的細節(jié)。

簡單工廠

作用

幫忙創(chuàng)建對象(核心方法可以使用靜態(tài)方法,稱之為靜態(tài)工廠)。

適用場景

  • 當不知道創(chuàng)建什么對象的時候去使用
  • 創(chuàng)建對象過于復雜的時候去使用。

優(yōu)點

簡單工廠是工廠模式中創(chuàng)建對象最簡單的方式,通俗容易理解。

缺點

當要生產(chǎn)對象的模塊發(fā)生了需求變更,此時要被實例化的類可能會增加或者減少,此時就需要改工廠模式的核心代碼,違背了開閉原則。

代碼

class Keyboard{
    public function run() {
        return '我能打字';
    }
}
class Mouse {
    public function run() {
        return '我能控制光標';
    }
}
class Factory {
    public static function build($key) {
        if($key == 'mouse') {
            return new Mouse();
        } else if ($key == 'keyboard') {
            return new Keyboard();
        }
    }
}
//----------調(diào)用端----------
$res = Factory::build('mouse')->run();
/*
筆者認為,簡單工廠可以簡化為以下寫法
但是這會有三個缺陷:
1. 能否做到類名寫法一致?不一定能做到
2. 缺少白名單機制,不安全,指不定new那個類,特別是這個參數(shù)守用戶傳參影響的場景,不過這個可以讓需要實例化的類實現(xiàn)一個接口,工廠方法添加typehint (類型約束)限制。
3. 如果修改白名單,又違背了開閉原則。
*/
class Factory {
    public static function build($class) {
        return ucfirst($class);
    }
}

工廠模式

作用

解決了簡單工廠模式中違背開閉原則的問題。

適用場景

  • 并解決了簡單工廠模式下,一旦類發(fā)生變化,就需要修改核心模塊的作用,遵循開閉原則。
  • 產(chǎn)品層變化較大的的場景

優(yōu)點

  • 將創(chuàng)建對象的過程推遲的子類去實現(xiàn),職責清晰,比較符合開閉原則。
  • 并解決了簡單工廠模式下,一旦類發(fā)生變化,就需要修改核心模塊的作。

缺點

額外增加設計復雜度,每增加一個類,就需要增加一個子工廠。增加了系統(tǒng)抽象性。

代碼

interface Usb {
    public function run();
}
class Keyboard implements USb {
    public function run() {
        return '我能打字';
    }
}
class Mouse implements USb {
    public function run() {
        return '我能控制光標';
    }
}
interFace Factory {
    public static function build();
}
class KeyboardFactory implements Factory {
    public static function build() :Keyboard {
        return new Keyboard();
    }
}
class MouseFactory implements Factory {
    public static function build() :Mouse {
        return new Mouse();
    }
}
//----------調(diào)用端----------
$res = MouseFactory::build()->run();

抽象工廠

作用

  • 抽象工廠相比于工廠模式,可以創(chuàng)建一堆互有關聯(lián)對象。
  • 抽象工廠的實現(xiàn)由4部分構成:抽象工廠,具體工廠,抽象產(chǎn)品,具體產(chǎn)品。

適用場景

對象創(chuàng)建過程復雜,并且類與類之間有關聯(lián)的時候。

優(yōu)點

抽象工廠可以用一個類的不同方法返回不同對象,(工廠模式一個子類生產(chǎn)一個對象,抽象工廠可以生產(chǎn)出多個對象),替代系統(tǒng)中存在大量的工廠類。

缺點

會產(chǎn)生較大的變動,需要添加指定的方法去維護抽象工廠的完整性。

代碼

interface Talk {
    public function say();
}
class EnglishTalk implements Talk {
    public function say() {
        return 'I can speak English';
    }
}
class ChineseTalk implements Talk {
    public function say() {
        return '我會說中文';
    }
}
interface Write {
    public function writeWord();
}
class EnglishWrite implements Write {
    public function writeWord() {
        return 'I can write English words';
    }
}
class ChineseWrite implements Write {
    public function writeWord() {
        return '我會寫漢字';
    }
}
interface Factory {
    public static function buildSay();
    public static function buildWriteWord();
}
class EnglishFactory implements Factory {
    public static function buildSay() :EnglishTalk {
        return new EnglishTalk();
    }
    public static function buildWriteWord() :EnglishWrite {
        return new EnglishWrite();
    }
}
class ChineseFactory implements Factory {
    public static function buildSay() :ChineseTalk {
        return new ChineseTalk();
    }
    public static function buildWriteWord():ChineseWrite {
        return new ChineseWrite();
    }
}
//----------調(diào)用端----------
//中國人對應會說漢語,或?qū)憹h字,這就是有關聯(lián),
$chinese_say        = ChineseFactory::buildSay()->say();
$chinese_write_word = ChineseFactory::buildWriteWord()->writeWord();

三者對比

 簡單工廠工廠模式抽象工廠
實現(xiàn)難度相對簡單相對復雜相對復雜
實現(xiàn)細節(jié)通過方法生產(chǎn)對象(不需要子類)通過子類方法去生產(chǎn)對象通過子類方法去生產(chǎn)有關聯(lián)的對象
優(yōu)點實現(xiàn)簡單解決了簡單工廠違背開閉原則的問題可以制造一堆有關聯(lián)的對象,減少工廠模式下工廠子類的數(shù)量
缺點違背開閉原則,不適用修改產(chǎn)品更加抽象,類數(shù)量增加,不方便維護更加抽象,類數(shù)量增加,不方便維護
適用場景簡單場景,類之間無關聯(lián)且不經(jīng)常變動需要實例化的產(chǎn)品容易有變動類之間有關聯(lián),且不經(jīng)常變動

到此這篇關于PHP設計模式中工廠模式深入詳解的文章就介紹到這了,更多相關PHP工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • PHP正則解析多重循環(huán)模板示例

    PHP正則解析多重循環(huán)模板示例

    這篇文章主要介紹了PHP正則解析多重循環(huán)模板,結合實例形式分析了php基于正則的循環(huán)遍歷與解析相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • PHP時間格式控制符對照表分享

    PHP時間格式控制符對照表分享

    整理的非常詳細,推薦給大家,留著以后方便查詢使用
    2013-07-07
  • 常用的PHP加密解密函數(shù)分享

    常用的PHP加密解密函數(shù)分享

    項目中有時我們需要使用PHP將特定的信息進行加密,也就是通過加密算法生成一個加密字符串,這個加密后的字符串可以通過解密算法進行解密,本文給大家分享了一些比較經(jīng)典的PHP加密解密函數(shù)代碼,需要的朋友可以參考下
    2023-09-09
  • 功能強大的PHP POST提交數(shù)據(jù)類

    功能強大的PHP POST提交數(shù)據(jù)類

    這篇文章主要為大家詳細介紹了功能強大的PHP POST提交數(shù)據(jù)類,代碼簡潔且具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • ASP和PHP都是可以刪除自身的

    ASP和PHP都是可以刪除自身的

    ASP和PHP都是可以刪除自身的...
    2007-04-04
  • PHP中的多種加密技術及代碼示例解析

    PHP中的多種加密技術及代碼示例解析

    php的加密技術有很多種,很多人一不小心就會搞混,所以今天就花點時間說說PHP中的信息加密技術.有需要的朋友可以了解一下。
    2016-10-10
  • Laravel實現(xiàn)隊列的示例代碼

    Laravel實現(xiàn)隊列的示例代碼

    這篇文章主要為大家詳細介紹了Laravel實現(xiàn)隊列的相關知識,文中的示例代碼講解詳細,具有一定的學習和借鑒價值,感興趣的小伙伴可以跟隨小編一起學習游戲
    2023-02-02
  • PHP實現(xiàn)的文件上傳類與用法詳解

    PHP實現(xiàn)的文件上傳類與用法詳解

    這篇文章主要介紹了PHP實現(xiàn)的文件上傳類與用法,結合實例形式較為詳細的分析了PHP文件上傳類的定義與具體使用方法,需要的朋友可以參考下
    2017-07-07
  • PHP中遍歷數(shù)組的三種常用方法實例分析

    PHP中遍歷數(shù)組的三種常用方法實例分析

    這篇文章主要介紹了PHP中遍歷數(shù)組的三種常用方法,結合實例形式分析了php針對數(shù)組使用for、foreach、list()、each()和while聯(lián)合使用遍歷數(shù)組相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能

    Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能

    這篇文章主要介紹了Linux系統(tǒng)下使用XHProf和XHGui分析PHP運行性能的方法,該方案支持Apache與Nginx服務器及多種數(shù)據(jù)庫環(huán)境,需要的朋友可以參考下
    2015-12-12

最新評論