PHP中单例模式和工厂模式学习总结
<?php////////////////////////////////////////////////单例模式/** *数据库连接职责的集中控制 *声明一个单例类*/class Database {private $_db;//声明一个私有的实例变量(构造对象时这个变量的值会被填充)static $_instance//声明一个静态变量(保存类中仅有的一个实例)//声明私有构造方法为了防止外部代码使用new操作符来创建对象private function _construct(){$this->_db = pg_connect('dbname = example_db');}//声明私有_clone方法为了消除php语言中可以复制对象从而破坏单一职责的一个漏洞private _clone(){};/** *声明getInstance()静态方法(单例模式实际构造);这个方法会检测静态实例变量是否已保存这个类的一个实例。 *假如它没有包含自身的一个实例,那么类会初始化并且保存到$_instance变量中. *下次访问这段代码时,$_instance 变量会保存类的一个实例,并且这个实例不会再次初始化。最后,这个方法返回实例的引用*/public static function getInstance(){if( !(self::$_instance instanceof self) ){self::$_instance = new self();}return self::$_instance;}public function query($sql){return pg_query($this->_db, $sql);//使用$this->_db执行一个查询}}/** *对单例类的使用*/$db = Database::getInstance();$db->query('select * from example_table');/** *使用不能被实例化的纯静态类*/class SomeClass {//防止类被当作实例使用private function _construct(){}public static function SomeMethod(){//执行一些操作} }/////////////////////////////////////////////////////////工厂模式:包含了一个专门用来创建其他对象的方法的类。/** *创建一个基本的工厂类*/class MyObject {//对象将从工厂返回}class MyFactory {public static function factory(){//返回对象一个新实例return new MyObject();}}//调用方法$instance = MyFactory::factory();////////////////////////////////////////////图片对象工厂/** *使用工厂类解析图片文件*/interface IImage {function getHeight();function getWidth();function getData();}class Iamge_PNG implements IImage {private $_width, $_height, $_data;public function _construct($file){$this->_file = $_file;$this->_parse();}private function _parse(){//完成格式化解析工作//并填充$_width, $_height, $_data}public function getWidth(){return $this->$_width;}public function getHeight(){return $this->$_height;}public function getData(){return $this->$_data;}}class Iamge_JPEG implements IImage {private $_width, $_height, $_data;public function _construct($file){$this->_file = $_file;$this->_parse();}private function _parse(){//完成格式化解析工作//并填充$_width, $_height, $_data}public function getWidth(){return $this->$_width;}public function getHeight(){return $this->$_height;}public function getData(){return $this->$_data;}}class ImageFactory {public static function factory($file){$pathParts = pathInfo($file);switch (strtolower($pathParts['extension'])) {case 'jpg' :$ret = new Image_JPEG($file);break;case 'png' :$ret = new Image_PNG($file);break;case 'gif' :$ret = new Image_GIF($file);break;default;// PROBLEM}if($ret instanceof IImage){return $ret;}else{//problem}}}//$image = ImageFactory::factory('/path/to/my.jpg');//$image现在是Image_JPEG类的一个实例echo $image->getWidth();/** *可移植的数据库 ×使用工厂类解决数据库可移植问题。*/interface IDatabaseBindings {public function userExists($email);}class PGSQL implements IDatabaseBindings {protected $_connection;public function _construct() {$this->$_connection = pg_connect('dbname = example_db');}public function userExists($email) {$emailEscaped = pg_escape_string($email);$query = 'select 1 from users where email = "'.$emailEscaped.'"';if ($result = pg_query($query, $this->$_connection)) {return (pg_num_row($result > 0)) ? true : false;}else{return false;}}}class MYSQL implements IDatabaseBindings() {protected $_connection;public function _construct() {$this->$connection = mysql_connect('localhost');mysql_select_db('example_db', $this->$_connection );}public function userExists($email) {$emailEscaped = mysql_real_escape_string($email);$query = 'select 1 from users where email = "'. $emailEscaped .'"';if ($result = mysql_query($query, $this->$_connection)) {return (mysql_num_rows($result) > 0 ) ? true : false;}else{return false;}}}class DatabaseFactory {public static function factory() {$type = loadtypefromconfigfile();switch ($type){case 'PGSQL':return new PGSQL();break;case 'MYSQL':return new MYSQL();break;}}}//用法$db = DatabaseFactory::factory();$db->userExists('person@example');?>