设计模式之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作为我们的项目管理工具.我们要建立两个仓库,一个用 ...
随机推荐
- python循环,判断及函数
python中的for循环 #for循环格式(类似Java中的foreach):for 标识符 in 列表名称 : >>> movies = ["movie1", ...
- HTML5 javascript实现音乐播放器
准备毕业了,感觉好多东西都没学会,太多太多想学的知识,有种求知若渴的状态. 四年的大学就剩下一个多月了,无论将来多么困难,这条路是自己选的,走就要走的精彩! 自学了一点javascript.php,做 ...
- C/C++各种系统开发环境搭建
http://pan.baidu.com/s/1qWJKF4g
- 为Spring添加REST功能
1 关于REST 我的理解,REST就是将资源以最合适的形式在服务端和客户端之间传递. 系统中资源采用URL进行标识(可以理解为URL路径中带参数) 使用HTTP方法进行资源的管理(GET,PUT,P ...
- 最短路(dijskra+SPFA+Bellman)
最短路 Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- android 常用调用系统功能
1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putEx ...
- 【插队问题-线段树-思维巧妙】【poj2828】Buy Tickets
可耻的看了题解 巧妙的思维 逆序插入,pos 代表的意义为前面要有pos个空格才OK: 证明:仔细思考一下就觉得是正确的,但是要想到这种方式还是要很聪明,空格是前面的几个数字所形成的,所以要特地留出来 ...
- Mac 任何选项没有了怎么办?
1.如果需要恢复允许"任何来源"的选项,即关闭 Gatekeeper,请打开终端 2.然后使用 spctl 命令: sudo spctl --master-disable
- meta标签的少许语法,慢慢收集中...
收集了一些meta的语法,也将不断的更新.不断做点滴的收集,总之,为了前端这些东西呀,我也是操碎了心... 1 <meta http-equiv="Content-Type" ...
- CSS垂直水平居中
小小的总结一下:行内元素水平居中用text-align: center;块级元素水平居中用margin-left: auto; margin-right: auto; 首先讨论一下单行时的情况. 毫无 ...