1.工厂模式,使用一个工厂方法或者类来生成对象,而不是在代码中直接new
2.单例模式,使某个类的对象只允许被创建一次
3.注册模式,用来解决全局共享和交换对象
理解:
1.工厂模式应用场景,有A、B、C、D1、D2、Factory 6个类,A、B、C中都实例化了D1,正常写法是在A,B,C中都写一次new D1,现有业务需求用D2代替D1,则需要把A,B,C中的每个D1都修改成D2,维护麻烦且易出错,工厂模式就是为解决这类问题而生,在Factory类中写一个静态方法
class Factory
{
static function createD()
{
$d = new D1();
return $d;
}
}
A、B、C在实例化D1时只需要调用
$d = Factory::createD();
现业务需求用D2代替D1,则只需要把工厂(Factory类)的createD方法中D1改为D2即可
$d = new D2();
2.单例模式应用场景,数据库连接只需一次。有一个私有的构造方法和属性(如:$db),和一个对外的方法可获取到该类的实例
class DataBase
{
private static $db;
private function __construct()
{
}
/**
* 在单例模式的静态方法中判断该类是否实例化
* @return Database
*/
public static function getInstance()
{
if (self::$db){
return self::$db;
} else {
self::$db = new self();
return self::$db;
}
}
}
工厂类中调用DataBase类,只能调用DataBase类的getInstance()方法
class Factory
{
static function createDatabase()
{
$db = DataBase::getInstance();
return $db;
}
}
3.注册树模式,应用场景,经过前两种模式结合,也必须要调用这个Factory类去创建对象,注册树模式就是用来解决全局共享和交换对象。实现原理,有一个受保护的静态属性$objectes,有对外的静态方法set()和get(),及_unset()
class Register
{
protected static $objects;
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
public static function get($name)
{
return self::$objects[$name];
}
public function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
调用、使用场景
Register::set('db1', Factory::createDatabase());
$db = Register::get('db1');
var_dump($db);
var_dump(get_class_methods($db));
来源:CSDN
作者:数学太陡
链接:https://blog.csdn.net/qq_28137309/article/details/103755863