浅析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 Memcached应用实现代码
Feb 08 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
分享ThinkPHP3.2中关联查询解决思路
Sep 20 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
PHP静态成员变量
Feb 14 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
php实现记事本案例
Oct 20 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缓存类代码(附详细说明)
2011/06/09 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
js中生成map对象的方法
2014/01/09 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
python操作CouchDB的方法
2014/10/08 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python利用有道翻译实现"语言翻译器"的功能实例
2017/11/14 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python-opencv 双线性插值实例
2020/01/17 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
安全教育感言
2014/03/04 职场文书
治庸问责心得体会
2014/09/12 职场文书
小学中队活动总结
2015/05/11 职场文书
红色革命电影观后感
2015/06/18 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js