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

簡單工廠簡述:

簡單工廠模式實現了產品類的代碼跟客戶端代碼分離,但會有一個問題,優秀的代碼是符合「開閉原則」若是你要加一個C類產品,你就要修改工廠類裏面的代碼,也就是說要增長條件語句如:switch---case。對於這個問題,接下來的工廠方法模式能夠解決這個問題。php

1、 什麼是工廠方法模式

工廠方法就是爲配一個產品提供一個獨立的工廠類,經過不一樣的工廠實例來建立不一樣的產品實例。mysql

2、 工廠方法模式的優勢

  1. 擁有良好的封裝性,代碼結構清晰。對於每個對象的建立都是有條件約束的。如:調用一個具體的產品對象,只須要知道這個產品的類名和約束參數就能夠了,不用知道建立對象自身的複雜過程。下降模塊之間的耦合度。
  2. 擁有良好的擴展性,新增一個產品類,只須要適當的增長工廠類或者擴展一個工廠類,以下面的例子中,當須要增長一個數據庫Oracle的操做,則只須要增長一個Oracle類,工廠類不用修改任務就可完成系統擴展。
  3. 屏蔽產品類。這一特色很是重要,產品類的實現如何變化,調用者都不須要關心,它只須要關心產品的接口,只要接口保持不變,系統中的上層模塊就不要發生變化。

3、使用場景

  1. 支付寶、微信、銀聯的鏈接方式(connectMode),支付方式(payMode)。 使用工廠模式,「客戶」就不須要要知道具體的鏈接方式和支付方式了, 只須要調用connectMode 和 payMode便可。
  2. MySQL、SQL Server、Oracle等數據庫的鏈接方式(connectMode)、查詢方式(selectMode)等操做可使用工廠模式進行封裝。

接下來看具體的案例:

產品類:
//抽象產品類
    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 "SQL Server鏈接對象返回";
        }
    
        function getOne()
        {
            return "SQL Server返回查詢結果";
        }
    }
工廠類:
//抽象工廠類
    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();
        }
    }
客戶:
$mysql = new FactoryMySql();
 $db1 = $mysql->createDataBase();

4、工廠方法模式的組成

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

工廠方法模式彷彿已經把對象的建立進行了很完美的包裝,使得客戶程序中僅僅處理抽象產品角色提供的接口。那咱們是否必定要在代碼中遍及工廠呢?大可沒必要。也許在下面狀況下你能夠考慮使用工廠方法模式:sql

  1. 當客戶程序不須要知道要使用對象的建立過程。
  2. 客戶程序使用的對象存在變更的可能,或者根本就不知道使用哪個具體的對象。

參考

系列源地址

WilburXu/design_pattern數據庫

系列目錄

  1. PHP 設計模式概述
  2. PHP設計模式(一)簡單工廠模式 (Simple Factory For PHP)
  3. PHP設計模式(二)工廠方法模式(Factory Method)
  4. PHP設計模式(三)抽象工廠模式(Abstract Factory)
  5. PHP設計模式(四)單例模式(Singleton)
相關文章
相關標籤/搜索