1 单例模式简单介绍

单例模式是一种经常使用的软件设计模式。

在它的核心结构中仅仅包括一个被称为单例类的特殊类。

通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存在一个。单例模式是最好的解决方式。

2 模式核心思想

1)某个类仅仅能有一个实例;
    2)它必须自行创建这个实例;

3)它必须自行向整个系统提供这个实例。

3 模式架构图

4 项目应用

4.1 需求说明

CleverCode在实际的PHP项目中,应用单例模式最多的就是涉及到网络连接的。比方Memcache和Redis连接,一般的需求通常Redis都仅仅有一台server,所以用单例模式将连接封装到getInstance(),这样做的优点是不用每次都去调用connect()方法,降低网络连接开销。

PHP都是单线程同步运行的,所以整个程序仅仅用实例化一个Redis对象就可以。(来之《CleverCode的项目》)

4.2 需求分析

依据4.1能够分析出使用单例模式比較适合php网络连接的操作。如Mysql。Memcache,Redis。Gearman等都能够尝试单例模式。当然Mysql可能涉及到连接池。仅仅须要将单例变成一个数组单例就可以。即$_instance = null,变成$_instance = array(),$_instance['con1'] = new Self('conn1');$_instance['con2'] = new Self('conn2');

4.3 程序源代码下载

http://download.csdn.net/detail/clevercode/8783989

4.4 程序说明

须要提前将Memcache与Redis增加到php扩展中。

1)单例模式设计Memcache操作类(MemcacheOperate.php)

<?php/*** MemcacheOperate.php** 单例模式设计Memcache操作类** Copyright (c) 2015 http://blog.csdn.net/CleverCode** modification history:* --------------------* 2015/6/8, by CleverCode, Create**/
class MemcacheOperate extends Memcache{// 实例protected static $_instance = null;/*** Singleton instance(获取自己的实例)** @return MemcacheOperate*/public static function getInstance(){if (null === self::$_instance) {self::$_instance = new self();$host = $_SERVER['MEMCACHE_HOST'];$port = $_SERVER['MEMCACHE_PORT'];self::$_instance->addServer($host, $port);}return self::$_instance;}
}

2)单例模式设计Redis操作类(RedisOperate.php)

<?

php /** * RedisOperate.php * * 单例模式设计Redis操作类 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/6/8, by CleverCode, Create * */ class RedisOperate extends Redis{ // 实例 protected static $_instance = null; /** * Singleton instance(获取自己的实例) * * @return RedisOperate */ public static function getInstance(){ if (null === self::$_instance) { self::$_instance = new self(); $host = $_SERVER['REDIS_HOST']; $port = $_SERVER['REDIS_PORT']; self::$_instance->connect($host, $port); } return self::$_instance; } }

3)client代码(singletonPattern.php)

<?

php /** * singletonPattern.php * * 单例模式 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/6/8, by CleverCode, Create * */ // 载入Memcache include_once ('MemcacheOperate.php'); // 载入Redis include_once ('RedisOperate.php'); /* * client类 * 让client和业务逻辑尽可能的分离,减少client和业务逻辑算法的耦合。 * 使业务逻辑的算法更具有可移植性 */ class Client{ /** * 初始化配置文件 * * @return null */ public static function initConfig(){ // Memcache 主机 $_SERVER['MEMCACHE_HOST'] = '192.168.6.201'; // Memcache port $_SERVER['MEMCACHE_PORT'] = 11211; // Redis 主机 $_SERVER['REDIS_HOST'] = '192.168.6.201'; // Redis port $_SERVER['REDIS_PORT'] = 6379; } /** * 主函数 * * @return null */ public function main(){ // 初始化配置 self::initConfig(); // Memcache key1 MemcacheOperate::getInstance()->set('key1', 'Memcache CleverCode1', 0, 100); echo MemcacheOperate::getInstance()->get('key1'); echo "\r\n---\r\n"; // Memcache key2 MemcacheOperate::getInstance()->set('key2', 'Memcache CleverCode2', 0, 100); echo MemcacheOperate::getInstance()->get('key2'); echo "\r\n---\r\n"; // Redis key3 RedisOperate::getInstance()->set('key3', 'Redis CleverCode3'); echo RedisOperate::getInstance()->get('key3'); echo "\r\n---\r\n"; // Redis key4 RedisOperate::getInstance()->set('key4', 'Redis CleverCode4'); echo RedisOperate::getInstance()->get('key4'); echo "\r\n---\r\n"; } } /** * 程序入口 */ function start(){ $client = new Client(); $client->main(); } start(); ?>

4.5 程序执行结果展示

5 总结

5.1 长处

1)实例控制
单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保全部对象都訪问唯一实例。

2)灵活性
由于类控制了实例化过程,所以类能够灵活更改实例化过程。

5.2 缺点

1)开销
尽管数量非常少,但假设每次对象请求引用时都要检查是否存在类的实例,将仍然须要一些开销。能够通过使用静态初始化解决此问题。

2)可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发者必须记住自己不能使用newkeyword实例化对象。

由于可能无法訪问库源码。因此应用程序开发者可能会意外发现自己无法直接实例化此类。

3)对象生存期
不能解决删除单个对象的问题。

在提供内存管理的语言中(比如基于.NET Framework的语言),仅仅有单例类可以导致实例被取消分配,由于它包括对该实例的私有引用。在某些语言中(如 C++),其它类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

版权声明:

1)原创作品。出自"CleverCode的博客",严禁转载,否则追究版权法律责任。
2)原创地址:http://blog.csdn.net/clevercode/article/details/46410055。
3)设计模式之PHP项目应用(23种设计模式文件夹):http://blog.csdn.net/clevercode/article/details/45741843(文件夹持续更新。关注请收藏)。
4)博客专栏地址(设计模式之PHP项目应用):http://blog.csdn.net/column/details/phpusedesignpattern.html(博客持续添加。关注请收藏)。
5)欢迎大家关注CleverCode博客很多其它的精彩内容:http://blog.csdn.net/CleverCode。

6)欢迎大家关注CleverCode的微博:http://weibo.com/CleverCode。

转载于:https://www.cnblogs.com/bhlsheji/p/5260458.html

设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类相关推荐

  1. Java设计模式之创建型:单例模式

    一.什么是单例模式: 单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例.单例模式的优点在于: 系统中只存在一个 ...

  2. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  3. Checking Table 设计模式 - 从概念、建模、设计到实现

    如何基于业务需求驱动理念来开展我们的模式创新,成为了当今架构师.设计师的重要职责之一.本文通过具体的 Checking Table 设计模式案例创新过程,阐述在核心业务需求分析中如何开展建模.设计并实 ...

  4. Checking Table 设计模式 - 从概念、建模、设计到实现——兼谈基于业务需求驱动的设计模式创新

    郑 先全, 架构师, NEC Asia Pacific Pte Ltd 简介: 如何基于业务需求驱动理念来开展我们的模式创新,成为了当今架构师.设计师的重要职责之一.本文通过具体的 Checking ...

  5. 基于Java EE平台项目管理系统的设计与实现(论文+PPT+源码)

    分类号_______________ 密级________________ UDC _______________ 学号 毕业设计(论文) 论文题目 基于Java EE平台项目管理系统的设计与实现 T ...

  6. [Python设计模式] 第21章 计划生育——单例模式

    github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...

  7. 自己拿项目,软件设计开发,释放你的力量

    自己拿项目,软件设计开发,释放你的力量,链接地址 http://un.zhubajie.com/r/?u=4674706&l=http://u.zhubajie.com/user/buyer ...

  8. 《AlwaysRun团队》第三次作业:团队项目的原型设计

    <AlwaysRun团队>第三次作业:团队项目的原型设计 项目 内容 这个作业属于哪个课程 [任课教师博客主页链接](https://home.cnblogs.com/u/nwnu-dai ...

  9. Atitit 项目的主体设计与结构文档 v5

    Atitit 项目的主体设计与结构文档 v5 1. 版本历史说明2 2. 功能大概说明2 3. 实现的目标3 3.1. cross device跨设备(pc 手机 平板)3 3.2. cross sc ...

最新文章

  1. JavaScript实现返回数字的二进制表示中使用的位数bitLength算法(附完整源码)
  2. 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器
  3. microsoft office 2007 完全 卸载 工具 来自微软官方
  4. liunx的urandom生成随机字符
  5. Excel操作-ApachePOI与EasyExcel
  6. python数值类型和序列类型_Python基础(一):数值类型,序列类型
  7. 京东全链路压测军演系统(ForceBot)架构解密
  8. dh参数逆运动学_干货 | 运动学好像够用了,我们为什么还需要动力学
  9. ReentrantReadWriteLock源码解读
  10. 计算机网络共享文件共享,终于发现如何取消计算机网络共享文件
  11. 2021-7-28-自动化运维Ansible
  12. response.sendRedirect 加域名或者不加域名的重定向加locahost或者不加localhost
  13. 码分复用:为什么可以通过收到的码片序列与站的序列做内积的值判断每个站是否发送数据及数据值
  14. 非常好的视频类软件下载与安装教程,非常棒
  15. 番茄花园版侵权被禁,用户怎么办?
  16. 计算机专业新生研讨课资料整合
  17. 当谈论机器学习中的公平公正时,我们该谈论些什么?
  18. 从AP微积分看美国的微积分教育
  19. 深度强化学习+金融投资的应用入门
  20. P4799 [CEOI2015 Day2]世界冰球锦标赛 (双端搜索)

热门文章

  1. 机器学习算法 拟合曲线_制定学习曲线以检测机器学习算法中的错误
  2. netflix 开源_Netflix的Polynote是一个新的开源框架,可用来构建更好的数据科学笔记本
  3. 嘉年华回顾丨阿里云吕漫漪带你一览POLARDB整体架构设计...
  4. 保护Eclipse RCP应用的商业Java编译器
  5. 两个女孩的生日最后演变成了鬼节
  6. 阿里云物联网平台,三要素生成hmacmd5,hmacsha1和hmacsha256,password算法+hashmd5,hashsha1,hashsha256算法
  7. 图像信噪比计算公式_CT 科研设计之图像质量对比研究三步曲
  8. python播放在线音乐_Python实现在线音乐播放器
  9. 从服务器上传和下载文件方法
  10. ncnn:提取所有层特征值