学习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获得文件扩展名三法
Nov 25 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
php防注入及开发安全详细解析
Aug 09 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
详解phpstorm2020最新破解方法
Sep 17 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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
使用 php4 加速 web 传输
2006/10/09 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
layui分页效果实现代码
2017/05/19 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
requests和lxml实现爬虫的方法
2017/06/11 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Python WSGI的深入理解
2018/08/01 Python
Python基本socket通信控制操作示例
2019/01/30 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
数控专业应届生求职信
2013/11/27 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
五年级作文之学校的四季
2019/12/05 职场文书