浅析php单例模式


Posted in PHP onNovember 25, 2014

本系列文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。

一、设计模式简介
首先我们来认识一下什么是设计模式:
设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。
设计模式不是Java的专利,我们用面向对象的方法在PHP里也能很好的使用23种设计模式。
那么我们常说的架构、框架和设计模式有什么关系呢?
架构是一套体系结构,是项目的整体解决方案;框架是可供复用的半成品软件,是具体程序代码。架构一般会涉及到采用什么样的框架来加速和优化某部分问题的解决,而好的框架代码里合理使用了很多设计模式。

二、提炼设计模式的几个原则:

开闭原则:模块应对扩展开放,而对修改关闭。
里氏代换原则:如果调用的是父类的话,那么换成子类也完全可以运行。
依赖倒转原则:抽象不依赖细节,面向接口编程,传递参数尽量引用层次高的类。
接口隔离原则:每一个接口只负责一种角色。
合成/聚合复用原则:要尽量使用合成/聚合,不要滥用继承。

三、设计模式的功用?

设计模式能解决
替换杂乱无章的代码,形成良好的代码风格
代码易读,工程师们都能很容易理解
增加新功能时不用修改接口,可扩展性强
稳定性好,一般不会出现未知的问题
设计模式不能解决:
设计模式是用来组织你的代码的模板,而不是直接调用的库;
设计模式并非最高效,但是代码的可读性和可维护性更重要;
不要一味追求并套用设计模式,重构时多考虑;

四、设计模式分类
1、创建型模式:
单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、创建者模式、原型模式。
2、结构型模式:
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3、行为型模式:
模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
五、创建型设计模式
1、单例模式
目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
应用场景:数据库连接、缓存操作、分布式存储。

     /**

     * 单例模式

     */

class DbConn

{

       private static $_instance = null;

       protected static $_counter = 0;

       protected $_db;

       //私有化构造函数,不允许外部创建实例

       private function __construct()

       {

              self::$_counter += 1;

       }

       public function getInstance()

       {

              if (self::$_instance == null)

              {

                     self::$_instance = new DbConn();

              }

              return self::$_instance;

       }

       public function connect()

       {

              echo "connected: ".(self::$_counter)."n";

              return $this->_db;

       }

}

/*

 * 不使用单例模式时,删除构造函数的private后再测试,第二次调用构造函数后,_counter变成2

*/

// $conn = new DbConn();

// $conn->connect();

// $conn = new DbConn();

// $conn->connect();

//使用单例模式后不能直接new对象,必须调用getInstance获取

$conn = DbConn::getInstance();

$db = $conn->connect();

//第二次调用是同一个实例,_counter还是1

$conn = DbConn::getInstance();

$db = $conn->connect();

特别说明:这里getInstance里有if判断然后再生成对象,在多线程语言里是会有并发问题的。例如java的解决方案有二个,给方法加上synchronized关键词变成同步,或者把_instanc的初始化提前放到类成员变量定义时,但是这2种方式php都不支持。不过因为php不支持多线程所以不需要考虑这个问题了。

小伙伴们是否对php设计模式的单例模式有所了解了呢?下一篇文章我们来介绍下工厂模式。

PHP 相关文章推荐
php 字符转义 注意事项
May 27 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
php操作xml入门之cdata区段
Jan 23 PHP
PHP自动生成表单代码分享
Jun 19 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
Joomla语言翻译类Jtext用法分析
May 05 PHP
php similar_text()函数的定义和用法
May 12 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 #PHP
php字符串截取函数用法分析
Nov 25 #PHP
浅谈ThinkPHP的URL重写
Nov 25 #PHP
ThinkPHP独立分组使用的注意事项
Nov 25 #PHP
php中in_array函数用法探究
Nov 25 #PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 #PHP
ThinkPHP提交表单时默认自动转义的解决方法
Nov 25 #PHP
You might like
PHP_MySQL教程-第一天
2007/03/18 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Python判断有效的数独算法示例
2019/02/23 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python定义一个函数的方法
2020/06/15 Python
python os.rename实例用法详解
2020/12/06 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
放飞蜻蜓反思
2014/02/05 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android