学习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简单系统数据添加以及数据删除模块源文件下载
Jun 07 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
php操作XML、读取数据和写入数据的实现代码
Aug 15 PHP
php生成QRcode实例
Sep 22 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php随机抽奖实例分析
Mar 04 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
利用php获得flv视频长度的实例代码
Oct 26 PHP
PHP cURL获取微信公众号access_token的实例
Apr 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
用header 发送cookie的php代码
2007/03/16 PHP
PHP 函数语法介绍一
2009/06/14 PHP
php调用c接口无错版介绍
2014/03/11 PHP
javascript Keycode对照表
2009/10/24 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
新手简单了解vue
2019/05/29 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
教你怎样写好自我评价
2013/10/05 职场文书
学雷锋日活动总结
2015/02/06 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python