下面示例中有、单例模式、工厂模式、注册树模式
单例模式:
//单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
//1.定义私有变量,用来保存当前类唯一实例对象
//2.创建私有的构造方法,防止外部代码使用 new 来创建对象
//3.创建私有克隆方法,防止类从外部克隆对象
//4.创建单一方法出口,并且为当前类的实例对象
//单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
具体如下:
<?php /** * Created by PhpStorm. * User: John * Date: 2018/5/10 * Time: 16:24 */ //单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。 //1.定义私有变量,用来保存当前类唯一实例对象 //2.创建私有的构造方法,防止外部代码使用 new 来创建对象 //3.创建私有克隆方法,防止类从外部克隆对象 //4.创建单一方法出口,并且为当前类的实例对象 //单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 class Singleton { //定义私有的属性,用来保存当前类唯一实例对象 //何为静态? 就是创建一次之后再次创建,会从内存中取出之前的创建的值,而不会重新创建,使用关键词 static 标识 private static $instance=null; private $types; //类型属性 //创建私有的构造方法,防止外部代码使用 new 来创建对象 private function __construct() { } //创建私有克隆方法,防止类从外部克隆对象 private function __clone() { // TODO: Implement __clone() method. } //创建单一方法出口,并且为当前类的实例对象 public static function getInstance() { //当访问时判断当前类是否已被实例化,如果等于null 则是没创建,并创建实例返回给当前 if(self::$instance==null){ self::$instance = new self(); } //如果已经创建则直接返回当前实例,防止重复创建 return self::$instance; } //为类型属性创建 set public function set($name) { $this->types = $name; } //为类型属性创建 get public function get($name) { return '当前的动物是:'.$this->types; } }
工厂模式:
//工厂模式/即 用于创建多种类型的多个实例对象
具体如下:
<?php /** * Created by PhpStorm. * User: John * Date: 2018/5/10 * Time: 17:10 */ //工厂模式/即 用于创建多种类型的多个实例对象 class Factory { //根据不同的动物类型创建不同的动物 public static function create($type,$action) { //检测类型 switch ($type) { //猫 case 'cat': return new Cat($action); break; //狗 case 'dog': return new Dog($action); break; } } } class Cat { private $types='猫'; private $move; public function __construct($action) { $this->move = $action; } public function action() { return '这个动物是:'.$this->types.'它要去:'.$this->move; } } class Dog { private $types='狗'; private $move; public function __construct($action) { $this->move = $action; } public function action() { return '这个动物是:'.$this->types.'它要去:'.$this->move; } }
注册树模式:
//其模式主要用于创建对象的时候将我们的对象与相应的变量进行绑定,其实就相当于我们平常说的IOC,DI,其最大好处就是将我们创建对象的步骤交给容器去管理,降低我们依赖关系模块的耦合度,方便代码的管理,结构更加清晰。
//为什么需要注册树模式?
//为解决常用对象的存放问题,实现类似于全局变量的功能。
//注册树经常与单例模式一起使用,先查看注册树上是否有该实例,有就直接使用,没有就生成一个实例,并挂到树上。有些时候我们还可以这样做,让get方法去获取,如果get不到实例的时候就自动new一个存放起来,这样我们使用时就不用管有没有存放过这个实例,反正没有的话get方法也会帮我们存放。
具体如下:
<?php /** * Created by PhpStorm. * User: John * Date: 2018/5/10 * Time: 18:44 */ //PHP注册树 //其模式主要用于创建对象的时候将我们的对象与相应的变量进行绑定,其实就相当于我们平常说的IOC,DI,其最大好处就是将我们创建对象的步骤交给容器去管理,降低我们依赖关系模块的耦合度,方便代码的管理,结构更加清晰。 //为什么需要注册树模式? //为解决常用对象的存放问题,实现类似于全局变量的功能。 //注册树经常与单例模式一起使用,先查看注册树上是否有该实例,有就直接使用,没有就生成一个实例,并挂到树上。有些时候我们还可以这样做,让get方法去获取,如果get不到实例的时候就自动new一个存放起来,这样我们使用时就不用管有没有存放过这个实例,反正没有的话get方法也会帮我们存放。 class RegTree { //创建注册树的过程一般有以下几点 //1.声明一个数组对象用来保存树中的对象 public static $obj =[]; //2.将对象挂载到注册树上 public static function set($index,$class) { //将传入的对象挂载到树中 self::$obj[$index] = $class; } //3.将对象从注册树上取出来 public static function get($index) { return self::$obj[$index]; } //4.销毁对象 public static function del($index) { unset(self::$obj[$index]); } }
单例模式、工厂模式、注册树模式测试类
<?php /** * Created by PhpStorm. * User: John * Date: 2018/5/10 * Time: 16:50 */ //引入单例模式 require 'class/Singleton.php'; //引入工厂模式 require 'class/Factory.php'; //引入注册树 require 'class/RegTree.php'; //实例化单例类 Singleton $sing = Singleton::getInstance(); //调用设置方法 $sing->set('猫'); echo '单例实例:'.$sing->get('猫'); echo '<br>'; //===================================== //实例化动物猫 $mat = Factory::create('cat','卖萌'); echo '工厂实例:'.$mat->action(); echo '<br>'; //实例化动物狗 $mat = Factory::create('dog','食屎'); echo '工厂实例:'.$mat->action(); echo '<br>'; //===================================== //注册树 //创建几个类,用于测试注册树 class User1{} class User2{} class User3{} //将上面创建的几个类分别按索引的方法挂载到树中去 RegTree::set('u1',new User1()); RegTree::set('u2',new User2()); RegTree::set('u3',new User3()); var_dump(RegTree::get('u2')); echo '<br>'; var_dump(RegTree::get('u3')); echo '<br>'; //删除 u1 RegTree::del('u1'); var_dump(RegTree::get('u1'));
具体结果: