学习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 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
php从数据库中读取特定的行(实例)
Jun 02 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
用PHP和ACCESS写聊天室(三)
2006/10/09 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
php 使用array函数实现分页
2015/02/13 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
文本框文本自动补全效果示例分享
2014/01/19 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Python深入学习之闭包
2014/08/31 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
教师推荐信范文
2013/11/24 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
Mysql文件存储图文详解
2021/06/01 MySQL