簡單工廠簡述: 簡單工廠模式實現了生產產品類的代碼跟客戶端代碼分離,在工廠類中你可以添加需要生成長跑的邏輯代碼(new 產品類),但是問題來了,優秀的代碼是符合“開閉原則”如果你要加一個C類產品,你就要修改工廠類裡面的代碼,也就是說要增加條件語句如:switch case。對於這個問題,接下來的工廠 ...
簡單工廠簡述:
簡單工廠模式實現了生產產品類的代碼跟客戶端代碼分離,在工廠類中你可以添加需要生成長跑的邏輯代碼(new 產品類),但是問題來了,優秀的代碼是符合“開閉原則”如果你要加一個C類產品,你就要修改工廠類裡面的代碼,也就是說要增加條件語句如:switch---case。對於這個問題,接下來的工廠方法模式可以解決這個問題。
一、 什麼是工廠方法模式
工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創建不同的產品實例。
在同一等級結構中,支持增加任意產品。
二、 工廠方法模式的優點
- 良好的封裝性,代碼結構清晰。一個對象創建是有條件約束的,如一個調用者需要一個具體的產品對象,只要知道這個產品的類名(或約束字元串)就可以了,不用知道創建對象的艱辛過程,降低模塊間的耦合。
- 擴展性非常好。在增加產品類的情況下,只要適當地修改具體的工廠類或擴展一個工廠類,就可以完成“擁抱變化”。如下麵的例子中,需要增加一個資料庫Oracle,則只需要增加一個Oracle類,工廠類不用修改任務就可完成系統擴展。
- 屏蔽產品類。這一特點非常重要,產品類的實現如何變化,調用者都不需要關心,它只需要關心產品的介面,只要介面保持不變,系統中的上層模塊就不要發生變化。
三、使用場景
- 支付寶、微信、銀聯的連接方式(connectMode),支付方式(payMode)。 使用工廠模式,“客戶”就不需要不要知道具體的連接方式和支付方式了, 只需要調用connectMode 和payMode即可。
- MySql、SqlServer、Oracle等資料庫的連接方式(connectMode)、查詢方式(selectMode)等操作可以使用工廠模式進行封裝。下麵的例子會講到。
四、工廠方法模式的組成
- 抽象工廠角色:這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。
- 具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程式調用以創建對應的具體產品的對象。
- 抽象產品角色:它是具體產品繼承的父類或者是實現的介面。
- 具體產品角色:具體工廠角色所創建的對象就是此角色的實例。
產品類:
<?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();
工廠方法模式仿佛已經很完美的對對象的創建進行了包裝,使得客戶程式中僅僅處理抽象產品角色提供的介面。那我們是否一定要在代碼中遍佈工廠呢?大可不必。也許在下麵情況下你可以考慮使用工廠方法模式:
- 當客戶程式不需要知道要使用對象的創建過程。
- 客戶程式使用的對象存在變動的可能,或者根本就不知道使用哪一個具體的對象。
如果有什麼疑問或者講錯的地方,歡迎大家留言。
一、 工廠方法模式的組成