学习php设计模式 php实现单例模式(singleton)


Posted in PHP onDecember 07, 2015

保证一个类仅有一个实例,并且提供一个访问它的全局访问点。
单例模式有三个特点:
1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例
一、单例模式结构图

学习php设计模式 php实现单例模式(singleton)

二、单例模式中主要角色
Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。
三、单例模式的优点
1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活
四、单例模式适用场景
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。
五、单例模式与其它模式】
工厂方法模式(factory method模式):单例模式使用工厂模式来提供自己的实例。
抽象工厂模式(abstract factory模式):抽象工厂模式可以使用单例模式,将具体工厂类设计成单例类。
建造者模式(Builder模式):建造模式可以将具体建造类设计成单例模式。
五、单例模式PHP示例

<?php
/**
 * 懒汉式单例类
 */
class Singleton {
 
 /**
  * 静态成品变量 保存全局实例
  */
 private static $_instance = NULL;
 
 /**
  * 私有化默认构造方法,保证外界无法直接实例化
  */
 private function __construct() {
 }
 
 /**
  * 静态工厂方法,返还此类的唯一实例
  */
 public static function getInstance() {
  if (is_null(self::$_instance)) {
   self::$_instance = new Singleton();
  }
 
  return self::$_instance;
 }
 
 /**
  * 防止用户克隆实例
  */
 public function __clone(){
  die('Clone is not allowed.' . E_USER_ERROR);
 }
 
 /**
  * 测试用方法
  */
 public function test() {
  echo 'Singleton Test!';
 }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
  * Main program.
  */
 public static function main() {
  $instance = Singleton::getInstance();
  $instance->test();
 }
}
 
Client::main();
?>

以上就是使用php实现单例模式的代码,还有一些关于单例模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
php对称加密算法示例
May 07 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
PHP常用的排序和查找算法
Aug 06 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 #PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 #PHP
PHP函数func_num_args用法实例分析
Dec 07 #PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 #PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 #PHP
学习php设计模式 php实现建造者模式
Dec 07 #PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 #PHP
You might like
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
自己开发Dojo的建议框架
2008/09/24 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
实现vuex原理的示例
2020/10/21 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
Python字典操作简明总结
2015/04/13 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python获取从命令行输入数字的方法
2015/04/29 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Django中url的反向查询的方法
2018/03/14 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
Django中的ajax请求
2018/10/19 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
详解python编译器和解释器的区别
2019/06/24 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
水电维修专业推荐信
2014/09/06 职场文书
英文感谢信范文
2015/01/21 职场文书
监考失职检讨书
2015/01/26 职场文书