您的位置:首页 > 编程语言 > PHP开发

PHP学习笔记:单例模式与工厂模式

2010-09-24 10:33 369 查看
单例模式被认为是职责模式,这是因为它将创建对象的控制权委托到一个单一的访问点上。在任何时候,应用程序中都只会有这个类仅有的一个实例存在。这可以防止我们去打开数据库的多个连接或者不必要地使用多余的系统资源。在更复杂的系统中,使用单例模式在维持应用程序状态的同步方面也尤其有用。
所有的单例模式至少拥有以下三种公共元素:
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: