設計模式之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






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM