php设计模式:单例、工厂、注册树
记录一下自己学习设计模式的代码;
本人小白不喜勿喷,有错误的地方请各位大佬多多指导;
/*
* 单例模式
* 1.静态属性
* 2.构造函数和克隆函数都要声明为受保护的,外部不可以访问
* 3.定义一个向外提供访问的静态公共方法
*/
class One
{
//定义一个用于保存该类唯一实例的静态属性
private static $instance = null;
//将构造函数声明为受保护的,防止外部new
protected function __construct(){}
//将克隆函数声明为受保护的,防止克隆该类
protected function __clone(){}
//定义一个向外提供访问的静态公共方法,在方法中判断该类是否已经被实例化
public static function getInstance(){
//这里可以使用static和self关键字调用类的静态属性,static可以实现单例模式的继承
if(!static::$instance instanceof static){ //instanceof 关键字用于判断该类是否被实例化
static::$instance = new static;
}
return static::$instance;
}
public function hello(){
echo 'hello 单例模式';
}
}
/*
* 工厂模式
* 用自身的静态方法来生产对象实例
*/
class MyFactory
{
//调用类的静态方法 一般会定义成factory
public static function factory(){
return One::getInstance();
}
}
/*
* 注册树模式
* 1.定义一个存储挂载对象的静态属性,这是一个数组
* 2.定义将对象挂载到树上的静态方法
* 3.定义一个获取树上挂载对象的静态方法
* 4.定义一个销毁树上挂在对象的静态方法
*/
class Register
{
//定义一个存储挂载对象的静态属性,对象池
public static $info = [];
/**
* 定义一个将对象挂载到树上的静态方法
* @param $alias
* @param $object
*/
public static function set($alias,$object){
return self::$info[$alias] = $object;
}
/**
* 获取注册树中挂载的对象
* @param $alias
* @return mixed
*/
public static function get($alias){
return self::$info[$alias];
}
/**
* 销毁注册树中挂载的对象
* @param $alias
*/
public static function del($alias){
unset(self::$info[$alias]);
}
}
Register::set('one',MyFactory::factory());
Register::get('one')->hello();
Register::del('one');