设计模式之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。
设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类的更多相关文章
- "围观"设计模式(7)--创建型之单例模式(Singleton Pattern)
单例模式,也叫单子模式,是一种经常使用的软件设计模式.在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在. 很多时候整个系统仅仅须要拥有一个的全局对象.这样有利于我们协调系统总体的行为.比方在某 ...
- js常用设计模式实现(一)单例模式
前言 什么是设计模式 设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠 设计模式的类型共分为创建型模式,结构型模式,行为型模式三种 ...
- 设计模式学习-使用go实现单例模式
单例模式 定义 优点 缺点 适用范围 代码实现 懒汉模式 饿汉模式 双重检测 sync.Once 参考 单例模式 定义 什么是单例模式:保证一个类仅有一个实例,并提供一个全局访问它的全局访问点. 例如 ...
- Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】
原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...
- 设计模式(Java语言)-单例模式
单例模式,简而言之就是在整个应用程序里面有且仅有一个实例,在程序的任何时候,任何地方获取到的该对象都是同一个对象.单例模式解决了一个全局的类被频繁创建和销毁的,或者每次创建或销毁都需要消耗大量cpu资 ...
- 第二天ci项目规划 数据库设计
第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...
- Atitit 项目的主体设计与结构文档 v3
Atitit 项目的主体设计与结构文档 v3 1. 实现的目标2 1.1. cross device跨设备(pc 手机 平板)作为规划2 1.2. 企业级Java体系与开发语言2 1.3. 高扩展性, ...
- 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms
开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms
- 项目结构的设计(iOS篇)
项目结构的设计(iOS篇) 本文附带源码:YoungHeart-Chapter-02.zip 在设计任何一个框架之前,都应规划好项目结构. 假定Git作为我们的项目管理工具.我们要建立两个仓库,一个用 ...
随机推荐
- Windows 7安装教程(详细图解)
早前向大家介绍了Windows XP的安装教程,今天思齐再来介绍一下Windows 7的安装教程,Windows 7在安装上相对以前的Windows操作系统都要简单一些,这一点对于尤其是非专业用户来说 ...
- mysql中timestamp,datetime,int类型的区别与优劣
转载请注明来自 souldak,微博: @evagle 以下内容 整合筛选自互联网: int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不 ...
- 50% 的财富 500 强企业使用 Windows Azure
在上周的北美TechEd大会上,我有幸见到了来自世界各地的客户.合作伙伴和分析师,其数量之多,让人震惊.没有什么比亲耳聆听使用 Windows Azure 来开创新天地的客户亲口讲述他们的故事更令人振 ...
- 【操作系统】linux创建子进程--fork()方法
(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...
- C++字符串之一(字符表示)
在C++中有两种类型可以用于表示字符,char和wchar_t. 但是字符串格式的标准却有很多种,如ASCII,UTF8,UTF16,UTF32等等.字符串的格式和char/wchar_t 的关系是什 ...
- Android中对闹钟Alarm的事件处理
之前的博文一直在持续分享Phone相关的知识也算是知识笔记,但在工作中难免遇到其他模块的一些问题,因此在解决这些问题的时候顺手将这些知识记录并分享出来.有些知识在不知道的时候会觉得非常难,当了解之后便 ...
- iOS获取本地ip(基本通用)
今天有个朋友问我怎样訪问手机ip,上网找了几个,用了近200多行代码,最后发现头文件用的居然还是Linux中的,OC没有这个头文件.感觉socket本身应该能够后去自己的ip就试了一下,果然7.8行代 ...
- C#中的枚举类型
浅谈C#中的枚举 转自http://www.cnblogs.com/liyingyi/archive/2005/12/28/306772.aspx 枚举类型是一种的值类型,它用于声明一组命名的常 ...
- 执行CMD代码
/// <summary> /// 发送CMD命令(执行命令行) /// </summary> public static void SendCMD(string pwd) { ...
- 连接远程hbase长时间等待问题
确保本地保存了远程主机名: 保存远程hosts