PHP学习笔记:单例模式与工厂模式
2010-09-24 10:33
369 查看
单例模式被认为是职责模式,这是因为它将创建对象的控制权委托到一个单一的访问点上。在任何时候,应用程序中都只会有这个类仅有的一个实例存在。这可以防止我们去打开数据库的多个连接或者不必要地使用多余的系统资源。在更复杂的系统中,使用单例模式在维持应用程序状态的同步方面也尤其有用。
所有的单例模式至少拥有以下三种公共元素:
1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法
单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
以下为封装数据库连接对象的一个单例类:
工厂类是指包含了一个专门用来创建其它对象的方法的类,工厂类在多态性编程实践中是至关重要的。
工厂模式通常用来返回符合类似接口的不同的类。工厂的一种常见用法就是创建多台的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应该实例化哪一个类。
以下范例使用工厂类解释图像文件:
所有的单例模式至少拥有以下三种公共元素:
1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法
单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
以下为封装数据库连接对象的一个单例类:
class Database { private $_db; static $_instance; private function __construct() { $this->_db = pg_connect('xxxx'); } private function __clone() {}; //覆盖__clone()方法,禁止克隆 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); } }
工厂类是指包含了一个专门用来创建其它对象的方法的类,工厂类在多态性编程实践中是至关重要的。
工厂模式通常用来返回符合类似接口的不同的类。工厂的一种常见用法就是创建多台的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应该实例化哪一个类。
以下范例使用工厂类解释图像文件:
interface IImage { function getHeight(); function getWidth(); function getDate(); } class Image_PNG implements IImage { private $_file; private $_width, $_height, $_date; public function __construct($file) { $this->_file = $file; $this->_parse(); } private function _parse() { //完成PNG图片文件的解释工作 //并填充$_width、$_height和$_date } public function getWidth() { return $this->_width; } public function getHeight() { return $this->_height; } public function getDate() { return $this->_date; } } class Image_JPEG implements IImage { private $_file; private $_width, $_height, $_date; public function __construct($file) { $this->_file = $file; $this->_parse(); } private function _parse() { //完成JPEG图片文件的解释工作 //并填充$_width、$_height和$_date } public function getWidth() { return $this->_width; } public function getHeight() { return $this->_height; } public function getDate() { return $this->_date; } } 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; default: //Exception } if($ret instanceof IImage) { return $ret; } else { //Exception } } } $image = ImageFactory::factory('/path/to/my.jpg'); echo $image->getWidth;
相关文章推荐
- [php学习笔记]工厂模式,单例模式、抽象类
- PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
- PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
- 学雷锋之工厂方法模式学习笔记[C++版]
- php 设计模式(学习笔记)
- C#设计模式学习笔记---简单工厂模式
- Java学习笔记——Java工厂模式之简单工厂
- 设计模式学习笔记——工厂方法(Factory Method)
- 设计模式学习笔记之工厂模式
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
- 简单工厂模式 和 策略模式 学习笔记
- java设计模式学习笔记--简单工厂模式
- php的设计模式学习系列(二)简单工厂模式
- php设计模式学习系列(三)工厂模式
- 工厂模式的学习笔记
- 设计模式学习笔记二:简单工厂模式
- 设计模式学习笔记----工厂模式
- 设计模式学习笔记之工厂模式
- java 设计模式 学习笔记(1) - 简单工厂模式
- C++学习笔记(二十八)工厂模式、简单工厂模式与抽象工厂模式