学习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巧获服务器端信息
Dec 06 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
Apr 24 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
php使用base64加密解密图片示例分享
Jan 20 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
详解【python】str与json类型转换
2019/04/29 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
国庆节演讲稿
2014/05/27 职场文书
品牌推广策划方案
2014/05/28 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
法学专业求职信范文
2015/03/19 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python