php实现设计模式中的单例模式详解


Posted in PHP onOctober 11, 2014

【概要】

保证一个类仅有一个实例,并且提供一个访问它的全局访问点【GOF95】

【特点】

1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例

【结构图】

php实现设计模式中的单例模式详解

【主要角色】

Singleton定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。

【优缺点】

1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活

【适用性】

1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。

【单例模式php实例】

<?php

 /**

 * 单例模式

 * -------------

 * @author   zhaoxuejie <zxj198468@gmail.com>

 * @package  design pattern 

 * @version  v1.0 2011-12-14

 */

class Singleton {

 

 //私有静态成员变量,保存全局实例

 private static $instance = NULL;

 

 //私有构造方法,保证外界无法直接实例化

 private function __construct(){}

 

 //静态方法,返回此类唯一实例

 public static function getInstance(){

  if(!isset(self::$instance)){

   $c = __CLASS__;

   self::$instance = new $c;

  }

  return self::$instance;

 }

 

 //测试用方法

 public function info(){

  return 'ok';

 }

 

 //防止克隆

 public function __clone(){

  trigger_error('Clone is not allowed.', E_USER_ERROR);

 }

}
$s = Singleton::getInstance();

echo $s->info();

?>
PHP 相关文章推荐
php 验证码实例代码
Jun 01 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
如何判断php数组的维度
Jun 10 PHP
PHP取余函数介绍MOD(x,y)与x%y
May 15 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
Sep 06 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 #PHP
php中字符集转换iconv函数使用总结
Oct 11 #PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 #PHP
PHP中执行cmd命令的方法
Oct 11 #PHP
PHP @ at 记号的作用示例介绍
Oct 10 #PHP
php json_encode()函数返回json数据实例代码
Oct 10 #PHP
PHP中构造函数和析构函数解析
Oct 10 #PHP
You might like
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python函数和模块的使用总结
2019/05/20 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
财务副总经理工作职责
2013/11/25 职场文书
书香校园活动方案
2014/02/28 职场文书
工厂搬迁方案
2014/05/11 职场文书
洗手间标语
2014/06/23 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
清洁工个人总结
2015/03/04 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
关于做家务的心得体会
2016/01/23 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
mysql查看表结构的三种方法总结
2022/07/07 MySQL