设计模式之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





posted @ 2016-03-10 08:14  phlsheji  阅读(2197)  评论(0编辑  收藏  举报