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)