单例模式的含义
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例(唯一的一个实例).
单例模式的特点
-
一个类只能有一个对象;
-
必须是自行创建这个类的对象(不是被外界调用new出来的!!!);
-
要向整个系统提供这一个对象(全局,使用此类的文件或程序,需要引入);
-
构造方法必须是private的
-
该类需要有一个私有的 clone 方法,防止被克隆
单例模式的优点
- 单例模式会阻止其他对象实例化其自身的单例对象副本,从而确保所有的对象都访问唯一实例。
- 因为类控制了实例化过程,所以类可以灵活的变更类的实例化过程(自身创建实例,而不是new出来的)
单例模式的缺点
- 虽然数量很少,但如果每次对象请求引用都要检查类是否存在实例化对象,将扔需要一些开销,可以通过静态化方法解决做个问题。
- 使用单例对象时,开发人员必须记住不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
单例模式的代码实现demo
1 <?php
class Demo{
static private $instance; //创建静态私有属性,保存该类对象
private $config; //参数
//防止直接创建对象
private function __construct($config){
$this->config = $config;
echo "我只能被实例化一次哦"."</br>";
}
//防止克隆
private function __clone(){
}
//静态公共方法实例化类
ststic public function getInstance($config){
//判断此类是否已经被实例化 ,没有被实例化,实例化,如果已经实例化,直接返回实例对象
if(!selt::$instance instanceof self){
self::$instance = new self($config);
}
return self::$instance;
}
//测试方法 (获取配置)
public function getConfig(){
echo $this->config
}
}
//实例化本类
$demo1 = Demo::getInstance("config_1");
$demo1 -> getConfig(); //输出config_1 !!!!!!!!!!!!!!
$demo2 = Demo::getInstance("config_2");
$demo2 -> getConfig(); //依然输出config_1 !!!!!!!!!!!!!!
//以上2次调用getConfig() 之前都调用了 getInstance,传入了不同的配置参数,但是输出都是第一次传入的值,因为第一次已经实例化了类,已经存在类的对象,就不在重置config 属性了。因此2次结果一样!!!!!!!!!