设计模式-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可以造成多个示例 */