PHP单例模式、工厂模式、注册模式

一、单例模式

通俗地说就是实例化出来的对象是唯一的。

所有的单例模式至少拥有以下三种公共元素:

1. 它们必须拥有一个构造函数,并且必须被标记为private

2. 它们拥有一个保存类的实例的静态成员变量

3. 它们拥有一个访问这个实例的公共的静态方法

单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

class Database

{

  //定义一个属性,该属性是静态的保护或私有属性

  protected static $db;


  //这里构造函数一定要是私有方法

  private function __construct()

  { 

    }


  //声明一个获取类实例的方法

  static function getInstace()

  { 

      if(self::$db) {

          return self::$db;

      }else {

          //生成自己

          self::$db = new self();

          return self::$db;

      } 

    }

}

//错误调用方法

//用new实例化private标记构造函数的类会报错

$db = new Database();


//正确获取实例方法

$db = Database::getInstace();

1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;

2.拥有一个保存类的实例的静态成员变量;

3.拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化);

4.如果严谨的话,还需要创建__clone()方法防止对象被复制(克隆)。


二、工厂模式

1、当我要实例化类的时候,不直接new这个类,而是通过调用另一个类的一个方法来实例化。这就是工厂模式的核心原理。

class Factory { //创建一个基本的工厂类

      static public function fac($id){//创建一个返回对象实例的静态方法

          if(1 == $id) return new A();

          elseif(2==$id) return new B();

          elseif(3==$id) return new C();

          return new D();

      }

  }

interface FetchName {//创建一个接口

    public function getname();//

}

class A implements FetchName{

    private $name = "AAAAA";

    public function getname(){ return $this->name; }

}

class C implements FetchName{

    private $name = "CCCCC";

    public function getname(){ return $this->name; }

}

class B implements FetchName{

    private $name = "BBBBB";

    public function getname(){ return $this->name; }

}

class D implements FetchName{

    private $name = "DDDDD";

    public function getname(){ return $this->name; }

}

$o = Factory::fac(6);//调用工厂类中的方法

if($o instanceof FetchName){

  echo  $o->getname();//DDDDD

}

$p=Factory::fac(3);

echo $p->getname();//CCCCC


三、注册模式

注册模式在单例模式的基础上进一步拓展了一步,他把所有单例模式的对象全部保存在一个索引数组中,下次取得时候,直接去数组里按照索引去取。

这样的好处是在程序中有条理的存放并管理对象。所以,肯定有一个存(set)和一个取(get)。一般是先去取如果没有,就重新初始化然后存起来,这样这个周期中的其他代码就可以直接取了。和redis缓存的道理是一样的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 前几天在GitHub看到一篇写PHP简洁之道的译文,觉得还不错,所以转在了自己的博客中,只不过有一些地方好像...
    guanguans阅读 645评论 3 6
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,358评论 0 17
  • 设计模式分类 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原...
    lifeline丿毅阅读 1,348评论 0 2
  • 2018.05.11 阅读者:life.笨女人 阅读书名: 好好学习 阅读页数:p26-p44(全文276页) 阅...
    刺头麻麻阅读 222评论 0 0
  • 从十月中旬开始到现在,丈夫一直在西南医院进进出出,做各种检查,期间也是反复的等待。好的是有手机的陪伴,等待检查和结...
    尘弥行走的故事阅读 644评论 4 10

友情链接更多精彩内容