面向对象的洗礼:设计模式(一)之简单工厂模式
昨晚开始看设计模式,我决定没看一种,就把它记录下来。一是晚上看,早上到公司,边写边回味。二是决定每看一章就写一篇博客,可以监督自己不会看着看着半途而废。
这应该就是一个系列博客了,书目录总共28种设计模式。这本书是我去赶集面试时推荐给我的,推荐了2本,一本大话设计模式,一本大话数据结构。想来想去,明白了一点,语言只是工具,真正的核心在于算法,设计模式,数据结构。本系列将已PHP为代码实现
设计模式是对OOP的思维体操,本篇是设计模式之简单工厂模式。
场景:实现PHP连接Mysql。
<?php $conn = mysql_connect('localhost', 'root', ''); mysql_select_db('blog', $conn); ?>
就这个?搞笑呢?项目里难道也用面向过程的?
<?php class MysqlDb{ private $conn = ''; public function connect($host, $username, $password){ if(empty($conn)){ $this->conn = mysql_connect($host, $username, $password); } } public function selectDb($dbName){ mysql_select_db($dbName, $this->conn); } } ?>
现在,请给我加一个查询方法
<?php class MysqlDb{ private $conn = ''; public function connect($host, $username, $password){ if(empty($conn)){ $this->conn = mysql_connect($host, $username, $password); } } public function selectDb($dbName){ mysql_select_db($dbName, $this->conn); } public function query($sql){ return mysql_query($sql); } public function selectOne($id){ $sql = "SELECT * FROM `tableName` WHERE `id` = '".$id."' LIMIT 0, 1"; return $this->query($sql); } public function selectList($id = ''){ if(!empty($id)){ $where = "WHERE `id` = '".$id."'"; } $sql = "SELECT * FROM `tableName`".$where; return $this->query($sql); } } ?>
好,现在项目发展了,单单Mysql不能满足需求了,请给我添加一个Redis。
<?php class RedisDb{ private $conn = ''; public function connect($host, $username, $password){ if(empty($conn)){ $this->conn = new Redis(); $this->conn->connect($host, $port); $this->conn->auth($password); $this->conn->select($dbName); } } public function getValue($key){ return $this->conn->get($key); } public function setValue($key, $value){ return $this->conn->set($key, $value); } } ?>
好了,难道每次都要在代码里调用这2个类?当然不!
<?php /** * 数据库工厂类 - 这就是简单工厂模式的分发。调用上面的几个类 */ class DbFactory{ private static $dbObj = ''; public static function init($dbType){ if(empty(self::$dbObj)){ self::$dbObj = self::dbSwitch($dbType); } return $dbObj; } private static function dbSwitch($dbType){ $dbType = strtolower($dbType); $obj = ''; switch($dbType){ case 'mysql': $obj = new MysqlDb(); break; case 'redis': $obj = new RedisDb(); break; case 'mysqli': $obj = new MysqliDb(); break; case 'pdo': $obj = new PdoDb(); break; default : exit('非法操作'); } return $obj; } } ?>