电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:512日期:2022-06-06 08:08:15
目錄
  • 簡介
  • 簡單工廠
    • 作用
    • 適用場景
    • 優點
    • 缺點
    • 代碼
  • 工廠模式
    • 作用
    • 適用場景
    • 優點
    • 缺點
    • 代碼
  • 抽象工廠
    • 作用
    • 適用場景
    • 優點
    • 缺點
    • 代碼
  • 三者對比

    簡介

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

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

    簡單工廠

    作用

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

    適用場景

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

    優點

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

    缺點

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

    代碼

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

    工廠模式

    作用

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

    適用場景

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

    優點

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

    缺點

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

    代碼

    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();
        }
    }
    //----------調用端----------
    $res = MouseFactory::build()->run();

    抽象工廠

    作用

    • 抽象工廠相比于工廠模式,可以創建一堆互有關聯對象。
    • 抽象工廠的實現由4部分構成:抽象工廠,具體工廠,抽象產品,具體產品。

    適用場景

    對象創建過程復雜,并且類與類之間有關聯的時候。

    優點

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

    缺點

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

    代碼

    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();
        }
    }
    //----------調用端----------
    //中國人對應會說漢語,或寫漢字,這就是有關聯,
    $chinese_say= ChineseFactory::buildSay()->say();
    $chinese_write_word = ChineseFactory::buildWriteWord()->writeWord();
    

    三者對比

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

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

    標簽: PHP
    相關文章:
    主站蜘蛛池模板: 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 冷油器-冷油器换管改造-连云港灵动列管式冷油器生产厂家 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 江苏皓越真空设备有限公司| 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 步入式高低温测试箱|海向仪器| 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 脱硫搅拌器厂家-淄博友胜不锈钢搅拌器厂家 | 智慧食堂_食堂管理系统_食堂订餐_食堂消费系统—客易捷 | 工业CT-无锡璟能智能仪器有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 真空乳化机-灌装封尾机-首页-温州精灌 |