三种基本设计模式
工厂模式
使用工厂方法或者类生成对象,而不是直接通过new关键字生成对象。
它可以应对修改参数、函数名的场景。可以根据传参不同的值,生成不同的对象。
例子:
// 传统的方法
class Database = {...}
$db = new Database();
// 工厂模式
class Factory
{
static function createDatabase()
{
$db = new Database();
return $db;
}
}
$db = Factory::createDatabase();
单例模式
某个类只允许实例化一个。
譬如说,我们的项目需要一个数据库的类,为了不在多个php里面实例化这个类,我们可以采用单例模式的形式。
例子:
class Database
{
// 私有静态属性
protected static $db;
// 私有构造方法
private function __construct(){}
// 私有__clone()方法,防止被克隆
private function __clone(){}
// 公有静态实例方法
public static function getInstance()
{
if(self::$db){
return self::$db;
}else{
self::$db = new self();
return self::$db;
}
}
}
// 调用方法
$db = Database::getInstance();
注册模式
用于解决全局共享以及交换对象。
只要在全局使用过工厂方法注册过该对象,在别的地方可以直接使用注册树的get方法获取到对象。
例子:
// 注册树类
class Register
{
protected static $object;
// 把对象注册到全局的树上面
static function set($keyName, $object)
{
self::$object[$keyName] = $object;
}
// 把对象从全局的树上卸载
function _unset()
{
unset(self::$object[$keyName]);
}
// 向外抛出实例对象
static function get($keyName)
{
return self::$object[$keyName];
}
}
// 工厂类
class Factory
{
public static function createDatabase()
{
// 调用了单例模式的获取实例对象的方法
$db = Database::getInstance();
return $db;
}
}
// 1.注册对象(可以放在应用初始化的文件完成)
Register::set('db1', Factory::createDatabase());
// 2.获取对象
Register::get('db1');