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. Html.ActionLink("linkText","actionName")

    一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...

  2. python----slots属性安全类

    问题:__slots__可以用于构造安全的类.如果一个类使用了__slots__那么它的属性就不在自由了. 下面举例说明: 1.自由属性. class person(object): def __in ...

  3. DenyHosts 安装及配置详解

    DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP ...

  4. jQuery validate (转载)

    转自:http://blog.sina.com.cn/s/blog_608475eb0100h3h1.html jQuery校验 官网地址:http://bassistance.de/jquery-p ...

  5. [转]JavaScript ES6 class指南

    [转]JavaScript ES6 class指南 前言 EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建 ...

  6. Android第三方应用分享图文到微信朋友圈 & 微信回调通知分享状态

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAAKUCAIAAAC8A9XzAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWX ...

  7. Effective C++笔记 55条编程法则

    1.  视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2.  尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const ...

  8. Android常用控件之GridView使用BaseAdapter

    我们可以为GridView添加自定义的Adapter,首先看下用自定义Adapter的显示效果 在布局文件main.xml文件中定义一个GridView控件 <RelativeLayout xm ...

  9. IOS-时间与字符串互相转换

    有时会遇到这种问题,须要把时间和时间戳互相转换 比方把"这种格式 或者是把""转换成"2014-07-16 15:54:36" 首先来第一个: 当前时 ...

  10. JS 匿名函数 自执行

    其实就是将函数直接做为表达调用,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数. 常见格式:(function() { /* code */ })(); 解释:包围函数(funct ...