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。









设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类的更多相关文章

  1. &quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

    单例模式,也叫单子模式,是一种经常使用的软件设计模式.在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在. 很多时候整个系统仅仅须要拥有一个的全局对象.这样有利于我们协调系统总体的行为.比方在某 ...

  2. js常用设计模式实现(一)单例模式

    前言 什么是设计模式 设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠 设计模式的类型共分为创建型模式,结构型模式,行为型模式三种 ...

  3. 设计模式学习-使用go实现单例模式

    单例模式 定义 优点 缺点 适用范围 代码实现 懒汉模式 饿汉模式 双重检测 sync.Once 参考 单例模式 定义 什么是单例模式:保证一个类仅有一个实例,并提供一个全局访问它的全局访问点. 例如 ...

  4. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  5. 设计模式(Java语言)-单例模式

    单例模式,简而言之就是在整个应用程序里面有且仅有一个实例,在程序的任何时候,任何地方获取到的该对象都是同一个对象.单例模式解决了一个全局的类被频繁创建和销毁的,或者每次创建或销毁都需要消耗大量cpu资 ...

  6. 第二天ci项目规划 数据库设计

    第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...

  7. Atitit 项目的主体设计与结构文档 v3

    Atitit 项目的主体设计与结构文档 v3 1. 实现的目标2 1.1. cross device跨设备(pc 手机 平板)作为规划2 1.2. 企业级Java体系与开发语言2 1.3. 高扩展性, ...

  8. 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms

    开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms

  9. 项目结构的设计(iOS篇)

    项目结构的设计(iOS篇) 本文附带源码:YoungHeart-Chapter-02.zip 在设计任何一个框架之前,都应规划好项目结构. 假定Git作为我们的项目管理工具.我们要建立两个仓库,一个用 ...

随机推荐

  1. linux配置jdk环境详解

    环境:Redhat Server 5.1(虚拟机) 工具:Xftp4  jdk-7-linux-i586.rpm文件 步骤1:把jdk-7-linux-i586.rpm文件拷贝到/usr/local目 ...

  2. C# 堆栈的数据结构 (二)

    堆栈是一种常用的数据结构,并且是线性表操作的子集,即操作受限的线性表.因此需要用到Clist 线性表类 public class CStack { private Clist m_List;//创建链 ...

  3. delphi 对TThread扩充TSimpleThread

    对线程的使用,是每个开发者都应该熟练掌握的,也是进阶的重要一环. 可以这样说,没有线程,连界面假死的问题都解决不了,就更别谈并行处理来提高效率了. 本例对线程进行改进,打造一个基础的线程,以后线程应用 ...

  4. Flex中如何通过设置GridLines对象的horizontalAlternateFill样式交错显示LineSeries图表背景颜色的例子

    原文 http://blog.minidx.com/2008/11/27/1652.html 接下来的例子演示了Flex中如何通过设置GridLines对象的horizontalAlternateFi ...

  5. VB.NET让webbrowser控件中JS脚本错误最新方法(2013-09-16)

    最近也是在项目中遇到了webbrowser控件中想关闭JS脚本错误窗口的问题,所以经过多次测试,终于用一段高效实用的代码完美解决webbrowser控件中JS脚本错误窗口关闭的问题. 通过创建一个子线 ...

  6. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  7. JD-GUI on Ubuntu 13.04 64-bit

    Java Decompiler (jd-gui) is a cute little tool I like using when working in Java. Unfortunately it o ...

  8. linux学习之(六)-主机名、网络IP的配置与查看

    设置Linux 本机IP有一个非常好用的命令就是setup命令,在Linux终端打入setup命令就会打开Linux配置窗口,如下图: . 在打开的窗口中通过上下键选择  Network config ...

  9. Debug, Release区别

    Debug, Release区别 Debug附加了很多调试信息,主要用于调试,所以文件大 Release就是经过优化的版本,去除了调试信息,进行了代码优化,所以文件较小,同时速度要快于Debug De ...

  10. php解决与处理网站高并发 大流量访问的方法

    方法/步骤   首先,确认服务器硬件是否足够支持当前的流量 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么 ...