PHP設計模式(二)工廠方法模式(Factory Method For PHP)

来源:http://www.cnblogs.com/bluebirds/archive/2016/11/22/6090100.html
-Advertisement-
Play Games

簡單工廠簡述: 簡單工廠模式實現了生產產品類的代碼跟客戶端代碼分離,在工廠類中你可以添加需要生成長跑的邏輯代碼(new 產品類),但是問題來了,優秀的代碼是符合“開閉原則”如果你要加一個C類產品,你就要修改工廠類裡面的代碼,也就是說要增加條件語句如:switch case。對於這個問題,接下來的工廠 ...


簡單工廠簡述:

  簡單工廠模式實現了生產產品類的代碼跟客戶端代碼分離,在工廠類中你可以添加需要生成長跑的邏輯代碼(new 產品類),但是問題來了,優秀的代碼是符合“開閉原則”如果你要加一個C類產品,你就要修改工廠類裡面的代碼,也就是說要增加條件語句如:switch---case。對於這個問題,接下來的工廠方法模式可以解決這個問題。

 

一、 什麼是工廠方法模式

  工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。

  在同一等級結構中,支持增加任意產品。

二、 工廠方法模式的優點

  1. 良好的封裝性,代碼結構清晰。一個對象創建是有條件約束的,如一個調用者需要一個具體的產品對象,只要知道這個產品的類名(或約束字元串)就可以了,不用知道創建對象的艱辛過程,降低模塊間的耦合。
  2. 擴展性非常好。在增加產品類的情況下,只要適當地修改具體的工廠類或擴展一個工廠類,就可以完成“擁抱變化”。如下麵的例子中,需要增加一個資料庫Oracle,則只需要增加一個Oracle類,工廠類不用修改任務就可完成系統擴展。
  3. 屏蔽產品類。這一特點非常重要,產品類的實現如何變化,調用者都不需要關心,它只需要關心產品的介面,只要介面保持不變,系統中的上層模塊就不要發生變化。

三、使用場景

  1. 支付寶、微信、銀聯的連接方式(connectMode),支付方式(payMode)。   使用工廠模式,“客戶”就不需要不要知道具體的連接方式和支付方式了, 只需要調用connectMode 和payMode即可。 
  2. MySql、SqlServer、Oracle等資料庫的連接方式(connectMode)、查詢方式(selectMode)等操作可以使用工廠模式進行封裝。下麵的例子會講到。

四、工廠方法模式的組成

  1. 抽象工廠角色:這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。
  2. 具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程式調用以創建對應的具體產品的對象。
  3. 抽象產品角色:它是具體產品繼承的父類或者是實現的介面。
  4. 具體產品角色:具體工廠角色所創建的對象就是此角色的實例。

 

產品類:

<?php
  //抽象產品類
abstract class DataBase { abstract function connect(); abstract function getOne(); }
  //具體產品類
class MySql extends DataBase { function connect() { return "MySql連接對象返回"; } function getOne() { return "MySql返回查詢結果"; } }
  //具體產品類
class SqlServer extends DataBase{ function connect() { return "SqlServer連接對象返回"; } function getOne() { return "SqlServer返回查詢結果"; } }

 

工廠類:

<?php

  //抽象工廠類
abstract class FactoryDataBase{ function createDataBase(){} }
  //具體工廠類
class FactoryMySql extends FactoryDataBase { public function createDataBase() { return new MySql(); } }
  //具體工廠類
class FactorySqlServer extends FactoryDataBase { public function createDataBase() { return new SqlServer(); } }

 

 

客戶:

<?php
    $mysql = new FactoryMySql();
    $db1 = $mysql->createDataBase();

 

工廠方法模式仿佛已經很完美的對對象的創建進行了包裝,使得客戶程式中僅僅處理抽象產品角色提供的介面。那我們是否一定要在代碼中遍佈工廠呢?大可不必。也許在下麵情況下你可以考慮使用工廠方法模式: 

  1. 當客戶程式不需要知道要使用對象的創建過程。      
  2. 客戶程式使用的對象存在變動的可能,或者根本就不知道使用哪一個具體的對象。

 

 

如果有什麼疑問或者講錯的地方,歡迎大家留言。

 

一、       工廠方法模式的組成


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1, 垃圾回收機制僅僅作用於堆記憶體,與棧記憶體無關; 2, 棧:stack 棧的存取速度比堆快,效率高 保存局部變數和對象的引用值 3, 堆:保存較大的變數 4, 編譯器處理int a = 3 時,首先會在棧中創建一個變數為a的引用,然後查找棧中是否存在3這個值,如果不存在,就將3存放進來; 處理b ...
  • 一、什麼是抽象工廠模式 抽象工廠模式的用意為:給客戶端提供一個介面,可以創建多個產品族中的產品對象 ,而且使用抽象工廠模式還要滿足以下條件: 產品族:位於不同產品等級結構中,功能相關聯的產品組成的家族。下麵例子的 汽車和空調就是兩個產品樹, 賓士C200+格力某型號空調就是一個產品族, 同理, 奧迪 ...
  • 接上一篇的工廠方法繼續工廠模式的練習。 先看一下抽象工廠的結構圖 產品族: 在上面的產品列表中呢,有兩個產品族,一個是“具體產品A--1”和”具體產品B--1“組成的一個族, 還有一個是“具體產品A--2”和“具體產品B--2”組成的一個族。 產品族就是在不同產品等級結構中,功能相關聯的產品組成的家 ...
  • 做過APP產品的技術人員都知道,APP應用屬於一種C/S架構的,所以在做多版本相容,升級等處理則比較麻煩,不像web應用那麼容易。下麵將帶大家分析幾種常見的情況和應對方式: 小改動或者新加功能的 這種情況,資料庫結構和API程式一般是可以相容多版本的,所以不用強制升級,可以坐到多版本共存。 儘量採用 ...
  • http是無狀態的,一次請求結束,連接斷開,下次伺服器再收到請求,它就不知道這個請求是哪個用戶發過來的。當然它知道是哪個客戶端地址發過來的,但是對於我們的應用來說,我們是靠用戶來管理,而不是靠客戶端。所以對我們的應用而言,它是需要有狀態管理的,以便服務端能夠準確的知道http請求是哪個用戶發起的,從 ...
  • 面向對象之理解 1.簡單舉例: 我們可以看到一個超市有收銀員,採購員,配貨員等. 收銀員之間:有不同的姓名,年齡,工號等,但有相同的行為方法,即掃描貨物,收錢,找錢等. 採購員之間:有不同的姓名,年齡,工號等,但有相同的行為方法,即統計缺貨數量,進行採購行為等. 配貨員之間:有不同的姓名,年齡,工號 ...
  • 接上篇簡單工廠模式進行改進。 由於簡單工廠模式違背開-閉原則,彈性太弱,例如增加一種鳥類,會造成修改類(工廠類) 好的實現應該是增加一種鳥類不影響現有類的修改。 思路: 在簡單工廠的基礎上我們增加一個抽象類(基礎抽象類),並且在基礎抽象工廠類中必須要定義一個抽象方法用來獲取所有鳥類的抽象基類,然後使 ...
  • 1、實體Entites 1.1 概念 實體是DDD(領域驅動設計)的核心概念之一。 實體是具有唯一標識的ID且存儲在資料庫總。實體通常被映射成資料庫中的一個表。 在ABP中,實體繼承自Entity類。 Id是所有繼承自Entity類的實體主鍵。 Id數據類型可以被更改,預設是int(int32)類型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...