PHP设计模式之单例模式定义与用法分析


Posted in PHP onMarch 26, 2019

本文实例分析了PHP设计模式之单例模式。分享给大家供大家参考,具体如下:

单例模式(Singleton Pattern 单件模式或单元素模式),是常见的一种设计模式,它有三个特点

  • 1.只能有一个实例
  • 2.必须自行创建这个实例
  • 3.必须给其他对象提供这一实例

下面用PHP代码实现一下

<?PHP
/**
 * Created by PHPStorm.
 * User: tiansi
 * Date: 18/1/2
 * Time: 下午3:40
 */
class Signleton{
  private static $_instanse = null;
  //私有化构造方法 防止外界使用new实例化对象
  private function __construct()
  {
  }
  //私有化克隆方法 防止外界克隆对象
  private function __clone()
  {
    // TODO: Implement __clone() method.
  }
  //静态化 提供单例访问入口
  static function getInstance(){
    if (is_null(self::$_instanse) || !isset(self::$_instanse)){
      self::$_instanse = new self();
    }
    return self::$_instanse;
  }
  public function say(){
    echo 'I am signleton';
  }
}

下面试一下调用

<?PHP
/**
 * Created by PHPStorm.
 * User: tiansi
 * Date: 18/1/2
 * Time: 下午3:48
 */
//第一种方式会报错 因为把构造方法私有化了
//PHP Fatal error: Uncaught Error: Call to private Signleton::__construct() from invalid context in /Users/apple/uxin/SignletonController.PHP:11
/*
$signleton1 = new Signleton();
$signleton1->say();
*/
//上述代码报错:Fatal error: Call to private Signleton::__construct() 
//实例化成功 输出I am signleton
$signleton2 = Signleton::getInstance();
$signleton2->say();

运行结果:

I am signleton

它的优缺点

优点:

  • 1.在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例
  • 2.单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
  • 3.提供了对唯一实例的受控访问。
  • 4.由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
  • 5.允许可变数目的实例。
  • 6.避免对共享资源的多重占用。

缺点:

  • 1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
  • 2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
  • 3.单例类的职责过重,在一定程度上违背了“单一职责原则”。
  • 4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

这是单例模式的优缺点,因为语言类型的不同,PHP的单例模式又不一样

众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时才有用

比如

1.应用程序与数据库交互

一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。

2.控制配置信息

如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
简单的php 验证图片生成函数
May 21 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
php 判断网页是否是utf8编码的方法
Jun 06 PHP
PHP开发注意事项总结
Feb 04 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
php+mysql开发中的经验与常识小结
Mar 25 #PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 #PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 #PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 #PHP
详解PHP神奇又有用的Trait
Mar 25 #PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 #PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 #PHP
You might like
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python编程实现希尔排序
2017/04/13 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
python3.6实现学生信息管理系统
2019/02/21 Python
python通过http下载文件的方法详解
2019/07/26 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
保护环境倡议书500字
2014/05/19 职场文书
红色旅游心得体会
2014/09/03 职场文书
2014统计局民主生活会对照检查材料思想汇报
2014/10/02 职场文书
单位工作证明书格式
2014/10/04 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL