【工厂模式】设计模式之工厂模式【原创】
生活随笔
收集整理的這篇文章主要介紹了
【工厂模式】设计模式之工厂模式【原创】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:主要是參考列旭松、陳文著的《PHP核心技術與最佳實踐》的2.1節。
1.1 簡介
工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。工廠模式(Factory)允許你在代碼執行時實例化對象。之所以被稱為工廠模式是因為它只負責‘生產’對象。以數據庫為例,工廠需要的是根據不同的參數,生產不同的實例化對象。最簡單的工廠模式就是根據傳入的類型名實例化對象,比如傳入Mysql,就調用Mysql的類并實例化,比如傳入SQLite,則調用SQLite的類并實例化,甚至可以處理TXT、EXCEL等‘類數據庫’。工廠類就是這樣的類,只負責生產對象,而不負責對象的具體內容。 工廠方法讓具體的對象解脫了出來,使其并不再依賴具體的類,而是抽象。1.2 優點
工廠模式的優點在于創建對象上。建立一個工廠(一個函數或一個類方法)來制造新的對象,它的任務就是把對象的創建過程都封裝起來,創建對象不是使用new的形式了。而是定義一個方法,用于創建對象實例。 通俗的說,以前創建一個對象要使用new,現在把這個過程封裝起來了。 假設不使用工廠模式:那么很多地方調用類a,代碼就會這樣子創建一個實例:new a(),假設某天需要把a類的名稱修改,意味著很多調用的代碼都要修改。1.3 簡單的工廠模式例子
代碼是參考百度百科的: https://baike.baidu.com/item/%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/9852061?fr=aladdin12 ? ?interface abstracted3 ? {4 ? ? ? ?public function realCreate();5 ? }67 ? ?//女人類8 ? ?class Woman9 ? {10 ? ? ? ?public function action()11 ? ? ? {12 ? ? ? ? ? ?echo '這是女人';13 ? ? ? }14 ? }1516 ? ?//男人類17 ? ?class Man18 ? {19 ? ? ? ?public function action()20 ? ? ? {21 ? ? ? ? ? ?echo '這是男人';22 ? ? ? }23 ? }2425 ? ?//創建女人26 ? ?class WomanCreator implements abstracted 27 ? {28 ? ? ? ?public $chromosome;//染色體29 ? ? ? ?public function realCreate(){30 ? ? ? ? ? ?if ($this->chromosome == "xx") {31 ? ? ? ? ? ? ? ?return new Woman();32 ? ? ? ? ? }33 ? ? ? }34 ? }3536 ? ?//創建男人37 ? ?class ManCreator implements abstracted 38 ? {39 ? ? ? ?public $chromosome;40 ? ? ? ?public function realCreate()41 ? ? ? {42 ? ? ? ? ? ?if ($this->chromosome == "xy" || $this->chromosome == "xyy") {43 ? ? ? ? ? ? ? ?return new Man();44 ? ? ? ? ? }45 ? ? ? }46 ? }4748 ? ?//人類工廠49 ? ?class PersonFactory50 ? {51 ? ? ? ?public function create($what){52 ? ? ? ? ? ?$create = $what."Creator";53 ? ? ? ? ? ?return $create = new $create();54 ? ? ? }55 ? }5657 ? ?$create = new PersonFactory();58 ? ?$instance = $create->create('Woman');59 ? ?$instance->chromosome = "xx";60 ? ?$instance->realCreate()->action();
1.4 數據庫適配器
使用工廠模式定義數據庫適配器,根據不同的數據庫參數實例化不同的數據庫類。定義一個數據庫適配器接口,規定一些通用的方法:2_Drivers\Db_Adapter.php:<?php /*** Db的適配器*/interface Db_Adapter {/*** 數據庫連接* @param array $config 數據庫配置* @return resource*/public function connect($config);/*** 執行數據庫查詢* @param string $query 數據庫查詢SQL字符串* @return resource*/public function query($query); }
定義一個Mysql數據庫的操作類(簡化版),實現了數據庫適配器接口: 2_Drivers\Db_Adapter_Mysqli.php: 1<?php2/**3 * 定義MySql數據庫的操作類4 */56require_once 'Db_Adapter.php';78class Db_Adapter_Mysqli implements Db_Adapter9{10 ? ?// 數據庫連接字符串標示11 ? ?private $_dbLink;1213 ? ?/**14 ? ? * 數據庫連接函數15 ? ? * @param array $config 數據庫配置16 ? ? * @return mysqli17 ? ? */18 ? ?public function connect($config)19 ? {20 ? ? ? ?$this->_dbLink = @mysqli_connect($config['host'] . (empty($config['port']) ? '' : ':' . $config['port']), $config['user'], $config['password']);21 ? ? ? ?if ($this->_dbLink) {22 ? ? ? ? ? ?if (@mysqli_select_db($this->_dbLink, $config['database'])) {23 ? ? ? ? ? ? ? ?if (isset($config['charset'])) {24 ? ? ? ? ? ? ? ? ? ?mysqli_query($this->_dbLink, "SET NAMES '{$config['charset']}'");25 ? ? ? ? ? ? ? }26 ? ? ? ? ? ? ? ?return $this->_dbLink;27 ? ? ? ? ? }28 ? ? ? }2930 ? ? ? ?// 數據庫異常31 ? ? ? ?throw new mysqli_sql_exception(@mysqli_error($this->_dbLink));32 ? }3334 ? ?/**35 ? ? * 執行數據庫查詢36 ? ? * @param string $query 數據庫查詢SQL字符串37 ? ? * @return bool|mysqli_result38 ? ? */39 ? ?public function query($query)40 ? {41 ? ? ? ?$handle = $this->_dbLink;42 ? ? ? ?$resource = @mysqli_query($handle, $query);43 ? ? ? ?if ($resource) {44 ? ? ? ? ? ?return $resource;45 ? ? ? } else {46 ? ? ? ? ? ?return false;47 ? ? ? }48 ? }49}50
接下來是SQLite數據庫的操作類(簡化版),同樣實現了數據庫適配器接口:2_Drivers\Db_Adapter_Sqlite.php:<?php /*** 定義SQLite數據庫的操作類*/require_once 'Db_Adapter.php';class Db_Adapter_Sqlite implements Db_Adapter {// 數據庫連接字符串標示private $_dbLink;/*** 數據庫連接函數* @param array $config 數據庫配置* @return resource* @throws Exception*/public function connect($config){$this->_dbLink = sqlite_open($config['file'], 0666, $error);if ($this->_dbLink){return $this->_dbLink;}// 數據庫異常throw new Exception($error);}/*** 執行數據庫查詢* @param string $query 數據庫查詢SQL字符串* @return bool|resource*/public function query($query){$handle = $this->_dbLink;$resource = @sqlite_query($query, $handle);if ($resource) {return $resource;} else {return false;}} }
定義一個工廠類,根據不同的參數生成不同的數據庫類,并實現簡單的查詢: 2_4_sql_factory.php: 12/**3 * 定義一個工廠類,可以根據參數的不同生成不同的數據庫類4 */56class SqlFactory7{8 ? ?public static function factory($type)9 ? {10 ? ? ? ?if (include_once '2_Drivers/Db_Adapter_' . $type. '.php') {11 ? ? ? ? ? ?$classname = 'Db_Adapter_' . $type;12 ? ? ? ? ? ?return new $classname;13 ? ? ? } else {14 ? ? ? ? ? ?throw new Exception('Driver not found');15 ? ? ? }16 ? }17}1819$db = SqlFactory::factory('Mysqli');20$config = [21 ? ?'host' => 'localhost',22 ? ?'user' => 'root',23 ? ?'password' => '123456',24 ? ?'database' => 'test_laravel',25];26$db->connect($config);27$res = $db->query('SELECT * FROM articles');28while ($row = mysqli_fetch_row($res)) {29 ? ?var_dump($row);30}31
注意:要調用時,可以這樣寫:$db = sqlFactory:factory('Mysqli'); $db = sqlFactory:factory('Sqlite');
轉載于:https://www.cnblogs.com/linewman/p/9918108.html
總結
以上是生活随笔為你收集整理的【工厂模式】设计模式之工厂模式【原创】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 学习应用篇之一: 初识Do
- 下一篇: 第二章:Webdriver 控制浏览器前