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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 跳转action_JS 跳转到指定Action | 学步园

最近项目需要在JS中跳转到指定的Action。通过不断的实验和查资料&#xff0c;终于成功。Java SSH2 架构下&#xff0c;正常 配置Action完毕。在xxx.jsp下window.location" ";例如&#xff1a;window.location" /user/ResAction> ";其中ResAction是配置文…

【转】康拓展开

———本文转自&#xff1a;http://www.cnblogs.com/1-2-3/archive/2011/04/25/generate-permutation-part2.html 1、康托展开  康托展开的公式是 Xan*(n-1)!an-1*(n-2)!...ai*(i-1)!...a2*1!a1*0! 其中&#xff0c;ai为当前未出现的元素中是排在第几个&#xff08;从0开始&a…

java类排序

1、实现Comparator接口 public static class ComparatorImpl implements Comparator<Element>{Overridepublic int compare(Element o1, Element o2) {if(o1.unitPrice > o2.unitPrice)return 1;else if(o1.unitPrice < o2.unitPrice){return -1;}else{return 0;}}…

java jni so_java 用jni调用so全过程

这几天一直在研究JNI的开发过程&#xff0c;顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c编译器的支持&#xff0c;网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它&#xff0c;感觉安装起来挺麻烦的。我使用GNUStep&#xff0c;下载地址http://www.gnust…

ios开发之 -- 自动轮播图创建

这里是oc版本的&#xff0c;简单记录下&#xff1a; 具体代码如下&#xff1a; 1&#xff0c;准备 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.width #define HEIGHT FRAME.size.height 2&#xff0c;具体实现 //scrollview的添加_bigScrollView…

学习进度(2016.3.13)

第二周所花时间&#xff08;包括上课&#xff09;14小时代码量&#xff08;行&#xff09;138行博客量&#xff08;篇&#xff09;4篇了解到的知识点动态数组的定义初始化和使用&#xff0c;指定范围获得随机数转载于:https://www.cnblogs.com/zzcs/p/5272365.html

binaryoperator java_BinaryOperatorT接口的用法示例

java Function函数中的BinaryOperator接口用于执行lambda表达式并返回一个T类型的返回值&#xff0c;下面的BinaryOperator用法示例让你简单了解一下。import java.util.function.BinaryOperator;public class TestDemo {public static void main(String[] args) {BinaryOperat…

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文——线性表接口的实现_Java中&#xff0c;我们实现了线性表的接口&#xff0c;今天让我们来实现线性表的顺序存储结构——顺序表类。 首先让我们来看下顺序表的定义&#xff1a; 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素&#xff0c;元素在…

Linux下安装jdk

参考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、准备阶段 ①下载jdk-6u45-linux-i586.bin&#xff0c;通过xftp上传至Linux系统中 ②在命令行执行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目录jdk1.6.0_45 ③移动到/usr/share下&…

JDK source 之 ArrayList 需要注意事项

线程安全 ArrayList内部没有实现原子性操作&#xff0c;所以是非线程安全的。如果需要在线程安全的环境下使用List的话&#xff0c;需要使用Vector 或者CopyOnWriteArrayList&#xff0c;具体场景&#xff0c;自行深入了解。 扩容算法 // minCapacity 为需要的最小容量 private…

为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上节&#xff0c;我们明白了proc文件系统的作用&#xff0c;接下来我们在友善之臂已经写好的led驱动的基础上&#xff0c;在proc目录下创建一个文件夹&#xff0c;然后加入led驱动的版本信息读取。 我们在init函数的…

java audiorecord_Android 录音实现(AudioRecord)

上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) &#xff0c;下面我们继续看看使用 AudioRecord 实现录音功能。AudioRecord首先看看Android帮助文档中对该类的简单概述: AndioRecord 类的主要功能是让各种 Java 应用能够管理音频资源&#…

SqlServer中的数据类型UniqueIdentifier

SqlServer中的数据类型UniqueIdentifier究竟是什么东东&#xff1f;该类型一般用来做为主键使用&#xff0c;可用SQL语法的newid()来生成一个唯一的值。我想请问的是&#xff0c;这个值是一个长整型的数据值呢&#xff0c;还是个其他的什么值&#xff1f;我在程序中该怎样去控制…

《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

这书适合我。 哈哈&#xff0c;结合 以前的知识点&#xff0c;勉强能看懂。 讲得细&#xff0c;还可以参照着弄出来。 希望能坚持 完成啦。。。 原来&#xff0c;JSTL就类似于DJANGO中的模板。 而servlet类中的res,req&#xff0c;玩了DJANGO就觉得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在负责日志中台的开发工作, 等等&#xff0c;啥是日志中台&#xff1f;俺只知道中台概念&#xff0c;这段时间的确很火&#xff0c;但是日志中台又是用来干啥的&#xff1f;这里小哈尽量地通俗的说下日志中台的职责&#xff0c;再说日志中台之…

脚本安装smokeping

我将提供两种方法来安装smokeping&#xff0c;一种是大家常用的普通安装&#xff0c;另一种是用脚本下自动化安装的&#xff0c;仅供大家学习&#xff0c;参考!普通安装&#xff1a;centos 5.4下安装smokeping需要的软件:(1)httpd(2)rrdtool(3)smokeping(4)fping(5)libwww-perl…

强烈推荐:Android史上最强大的自定义任务软件Tasker

强烈推荐&#xff1a;Android史上最强大的自定义任务软件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出处: 木蚂蚁手机乐园) Android上的Tasker绝对称得上是Android系统的神器之一&#xff0c;与Auto Memory Manager不同&#xff0c;Tasker不是加速型的软件&#xff0…

配置文件*.xml中 classpath: 与 classpath*: 的区别

首先classpath 指的是WEB-INF下面的classes目录&#xff0c;所有src目录下面的java、xml、properties等文件编译后都会在此,classes在eclipse的项目目录下是看不到的&#xff0c;它存在于部署在服务器上的项目目录WEB-INF下 classpath:指的是第一个classpath路径&#xff0c;也…

原型模式 java 深浅_JAVA设计模式---原型模式--浅客隆和深克隆

JAVA浅克隆和深克隆浅克隆&#xff1a;被复制对象的所有变量和原来相同&#xff0c;而所有的对其他对象的引用仍指向原对象。即如果复制的对象修改复制对象的变量&#xff0c;原对象不会改变。而修改引用的对象&#xff0c;二者均会发生改变。深复制(克隆)&#xff1a;被复制对…

SocketErrorCode:10022

在编写.net的网络服务器时&#xff0c;我使用了裸socket来实现。在windows上&#xff0c;或者在linux上通过.net core来跑时都没有什么问题&#xff0c;但是通过mono运行调用socket.Bind()时却总是报ErrorCode为10022的SocketException&#xff0c;表示参数无效。通过命令netst…