工厂模式
工厂模式(Factory)允许你在代码执行时,动态地创建不同的对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是你要创建的对象所对应的类名称。
<?php
class Example {
public static function factory($type) // 工厂方法 {
if (include_once 'Drivers/' . $type . '.php') { // 加载对应的类文件
$classname = 'Driver_' . $type;
return new $classname; // 返回创建的对象
} else {
throw new Exception ('Driver not found');
}
}
}
?>
上面的方式可以动态加载数据库驱动类。如果Example类是一个数据库抽象类,那么,可以这样来生成 MySQL 和 SQLite 驱动对象。
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
单例模式
单例模式用于为一个类生成一个唯一的对象,程序运行过程中,只能有一个对象存在。(如:数据库操作类)
单例模式的特点:
- 构造方法私有化,防止在类外部直接创建对象。
- 必须要产生一个对象,使用静态方法,在方法内部实例化对象,且保存到静态属性中。
- 魔术方法__clone()私有化,防止用户复制(克隆)对象实例。
单例模式的优点:
- 内存中只会存在一个对象,因此,单例模式可以节省系统资源。对于一些需要经常创建和销毁的对象,单例模式无疑可以提高系统的性能。
- 单例模式提供的对象是固定的,只允许通过一种途径来实例化对象,便于对象的控制和共享。
<?php
class Test{
// 在静态属性中保存类实例
private static $instance;
// 构造方法私有化,防止在类外部直接创建对象
private function __construct(){}
// 魔术方法__clone()私有化,防止用户复制(克隆)对象实例
private function __clone(){}
/** * 获取单例 */
public static function getInstance(){
if(!isset(self::$instance)){
// 在类内部实例化对象
$instance = new Test(); // 或 $instance = new __CLASS__;
self::$instance = $instance;
}
return self::$instance;
}
}
?>
<?php
$obj = Test::getInstance();
var_dump($obj);
?>