设计模式-Singleton(单例模式)
单件模式-独一无二的对象
定义:单件模式确保一个类只有一个实例,并提供一个全局访问点。
单例模式应该是所有设计模式中最广为人知的一个模式,我记得当年面试的时候问到设计模式相关的时候,单例模式总是免不了被涉及到。单例其实核心的点就是只有一个实例的类,如何确保只有一个,首先要有一个地方保存这个类,一般是静态变量,还有如何避免被实例,那么方法就是只能自己实例化自己,这样在全局访问点上面唯一。这个类没有什么多说的,析构函数私有化,提供一个全局访问点,静态变量保存本身。其他的 一些序列化或者反序列化的 根据语言本身注意下,例如php的clone 和 wakeup
<?php
/**
* @desc 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例
* 参考资料
*/
class Singleton{
//私有变量用来保存单例
private static $_instance;
//私有化析构函数 只能自己调用,不能通过new 实例化
private final function __construct(){}
/**
* @desc 只能通过这个接口来获取实例
* @return singleTon 返回实例类
*/
public static function getInstance(){
if(!self::$_instance instanceof self){
self::$_instance = new singleTon();
}
return self::$_instance;
}
/**
* @desc 防止通过克隆对象造成多个实例 或者 private 私有化当前函数
* @return Exception 异常抛出
*/
public function __clone(){
throw new Exception('You cannot clone singleton object');
}
/**
* @desc 防止序列化克隆对象造成多个实例 或者 private 私有化当前函数
* @return Exception 异常抛出
*/
public function __wakeup(){
throw new Exception('You cannot unserializing singleton object');
}
/**
* @desc 公共函数服务 用来测试
* @return __FUNCTION__ 返回当前函数名
*/
public function funcOne(){
return __FUNCTION__;
}
}
$instance = Singleton::getInstance();
/**
* 测试序列化 未设置 __wakeup 异常或者未私有化__wakeup
$serlizeObj = serialize($instance);
$objOne = unserialize($serlizeObj);
$objTwo = unserialize($serlizeObj);
var_dump($objOne === $objTwo); //return false 序列化可以造成多个示例
**/
/**
* $b = new Singleton();
* return fatal error 不能被实例化 只能通过自身实例
*/
/** 测试代码 未设置 __clone 异常或者未私有化__clone
$instance = Singleton::getInstance();
$instance_clone = clone $instance;
var_dump($instance === $instance); //return false clone可以造成多个示例
*/
