PHP实战中知识总结 / 设计模式 - 单例模式

一、单例模式

是一种常用的软件设计模式,是属于创建型模式,其定义是单例对象的类只允许一个实例存在,即实例化出来的对象是唯一的。

二、特点:(三私一公)

(1)私有化一个属性用于存放唯一的实例。

(2)私有化构造函数,防止被直接创建对象。

(3)私有化克隆方法,防止克隆对象。

(4)公有化静态方法,用于向系统提供这个实例。

三、优缺点

1、优点

(1)使用单例模式可以避免大量的new操作,减少消耗资源。

(2)在内存里只有一个实例,减少内存的开心,尤其是频繁创建和销毁实例。

(3)避免对资源的多重占用,比如写文件操作。

2、缺点

(1)不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

(2)单例类的职责过重,在一定程度上违背了单一职责原则。

(3)如果实例化的对象长时间不被利用,则会被系统回收,这将导致对象状态的丢失。

<?php
class Person{

  static private $instance;         //创建静态私有的变量保存该类对象
  private $config;             //参数
  private function __construct($config){  //防止外部代码使用new来创建对象。
    echo "我是";
    $this -> config = $config;
  }
  private function __clone(){        //防止克隆对象
  }
  static public function getInstance($config){
    if (!self::$instance instanceof self) {//判断$instance是否是Person的对象,没有则创建
      self::$instance = new self($config);
    }
    return self::$instance;

  }
  public function getName(){
    echo $this -> config;
  }
}
$db1 = Person::getInstance('Jack');
$db1 -> getName();
echo "<br>";
$db2 = Person::getInstance('John');
$db2 -> getName();
?>
//运行结果:
我是Jack ($db1创建对象后,参数是jack)
Jack($db2没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为John)

PHP实战中知识总结