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 相关文章推荐
php SQL之where语句生成器
Mar 24 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
PHP生成图表pChart的示例解析
Jul 31 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
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
理解javascript回调函数
2014/12/28 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
python3编写C/S网络程序实例教程
2014/08/25 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Flask-Mail用法实例分析
2018/07/21 Python
python实现移位加密和解密
2019/03/22 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python 多进程原理及实现
2020/12/21 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
超市开店计划书
2014/04/26 职场文书
导师推荐信范文
2014/05/09 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
个人批评与自我批评
2014/10/15 职场文书
2014年公务员工作总结
2014/11/18 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书