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





轉載于:https://www.cnblogs.com/bhlsheji/p/5260458.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257562.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 跳轉action_JS 跳轉到指定Action | 學步園

最近項目需要在JS中跳轉到指定的Action。通過不斷的實驗和查資料&#xff0c;終于成功。Java SSH2 架構下&#xff0c;正常 配置Action完畢。在xxx.jsp下window.location" ";例如&#xff1a;window.location" /user/ResAction> ";其中ResAction是配置文…

【轉】康拓展開

———本文轉自&#xff1a;http://www.cnblogs.com/1-2-3/archive/2011/04/25/generate-permutation-part2.html 1、康托展開  康托展開的公式是 Xan*(n-1)!an-1*(n-2)!...ai*(i-1)!...a2*1!a1*0! 其中&#xff0c;ai為當前未出現的元素中是排在第幾個&#xff08;從0開始&a…

java類排序

1、實現Comparator接口 public static class ComparatorImpl implements Comparator<Element>{Overridepublic int compare(Element o1, Element o2) {if(o1.unitPrice > o2.unitPrice)return 1;else if(o1.unitPrice < o2.unitPrice){return -1;}else{return 0;}}…

java jni so_java 用jni調用so全過程

這幾天一直在研究JNI的開發過程&#xff0c;順便把NDK環境搭建一起總結下。在windows環境下開發jni需要c/c編譯器的支持&#xff0c;網絡上我看很多人使用cygwin。呵呵我不是很喜歡使用它&#xff0c;感覺安裝起來挺麻煩的。我使用GNUStep&#xff0c;下載地址http://www.gnust…

ios開發之 -- 自動輪播圖創建

這里是oc版本的&#xff0c;簡單記錄下&#xff1a; 具體代碼如下&#xff1a; 1&#xff0c;準備 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.width #define HEIGHT FRAME.size.height 2&#xff0c;具體實現 //scrollview的添加_bigScrollView…

學習進度(2016.3.13)

第二周所花時間&#xff08;包括上課&#xff09;14小時代碼量&#xff08;行&#xff09;138行博客量&#xff08;篇&#xff09;4篇了解到的知識點動態數組的定義初始化和使用&#xff0c;指定范圍獲得隨機數轉載于:https://www.cnblogs.com/zzcs/p/5272365.html

binaryoperator java_BinaryOperatorT接口的用法示例

java Function函數中的BinaryOperator接口用于執行lambda表達式并返回一個T類型的返回值&#xff0c;下面的BinaryOperator用法示例讓你簡單了解一下。import java.util.function.BinaryOperator;public class TestDemo {public static void main(String[] args) {BinaryOperat…

線性表的順序存儲結構之順序表類的實現_Java

在上一篇博文——線性表接口的實現_Java中&#xff0c;我們實現了線性表的接口&#xff0c;今天讓我們來實現線性表的順序存儲結構——順序表類。 首先讓我們來看下順序表的定義&#xff1a; 線性表的順序存儲是用一組連續的內存單元依次存放線性表的數據元素&#xff0c;元素在…

Linux下安裝jdk

參考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、準備階段 ①下載jdk-6u45-linux-i586.bin&#xff0c;通過xftp上傳至Linux系統中 ②在命令行執行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目錄jdk1.6.0_45 ③移動到/usr/share下&…

JDK source 之 ArrayList 需要注意事項

線程安全 ArrayList內部沒有實現原子性操作&#xff0c;所以是非線程安全的。如果需要在線程安全的環境下使用List的話&#xff0c;需要使用Vector 或者CopyOnWriteArrayList&#xff0c;具體場景&#xff0c;自行深入了解。 擴容算法 // minCapacity 為需要的最小容量 private…

為Tiny4412設備驅動在proc目錄下添加一個可讀版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上節&#xff0c;我們明白了proc文件系統的作用&#xff0c;接下來我們在友善之臂已經寫好的led驅動的基礎上&#xff0c;在proc目錄下創建一個文件夾&#xff0c;然后加入led驅動的版本信息讀取。 我們在init函數的…

java audiorecord_Android 錄音實現(AudioRecord)

上一篇文章介紹了使用 MediaRecorder 實現錄音功能 Android錄音實現(MediaRecorder) &#xff0c;下面我們繼續看看使用 AudioRecord 實現錄音功能。AudioRecord首先看看Android幫助文檔中對該類的簡單概述: AndioRecord 類的主要功能是讓各種 Java 應用能夠管理音頻資源&#…

SqlServer中的數據類型UniqueIdentifier

SqlServer中的數據類型UniqueIdentifier究竟是什么東東&#xff1f;該類型一般用來做為主鍵使用&#xff0c;可用SQL語法的newid()來生成一個唯一的值。我想請問的是&#xff0c;這個值是一個長整型的數據值呢&#xff0c;還是個其他的什么值&#xff1f;我在程序中該怎樣去控制…

《架構探險——從零開始寫Java Web框架》這書不錯,能看懂的入門書

這書適合我。 哈哈&#xff0c;結合 以前的知識點&#xff0c;勉強能看懂。 講得細&#xff0c;還可以參照著弄出來。 希望能堅持 完成啦。。。 原來&#xff0c;JSTL就類似于DJANGO中的模板。 而servlet類中的res,req&#xff0c;玩了DJANGO就覺得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通過 Java 壓縮文件,打包一個 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在負責日志中臺的開發工作, 等等&#xff0c;啥是日志中臺&#xff1f;俺只知道中臺概念&#xff0c;這段時間的確很火&#xff0c;但是日志中臺又是用來干啥的&#xff1f;這里小哈盡量地通俗的說下日志中臺的職責&#xff0c;再說日志中臺之…

腳本安裝smokeping

我將提供兩種方法來安裝smokeping&#xff0c;一種是大家常用的普通安裝&#xff0c;另一種是用腳本下自動化安裝的&#xff0c;僅供大家學習&#xff0c;參考!普通安裝&#xff1a;centos 5.4下安裝smokeping需要的軟件:(1)httpd(2)rrdtool(3)smokeping(4)fping(5)libwww-perl…

強烈推薦:Android史上最強大的自定義任務軟件Tasker

強烈推薦&#xff1a;Android史上最強大的自定義任務軟件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出處: 木螞蟻手機樂園) Android上的Tasker絕對稱得上是Android系統的神器之一&#xff0c;與Auto Memory Manager不同&#xff0c;Tasker不是加速型的軟件&#xff0…

配置文件*.xml中 classpath: 與 classpath*: 的區別

首先classpath 指的是WEB-INF下面的classes目錄&#xff0c;所有src目錄下面的java、xml、properties等文件編譯后都會在此,classes在eclipse的項目目錄下是看不到的&#xff0c;它存在于部署在服務器上的項目目錄WEB-INF下 classpath:指的是第一個classpath路徑&#xff0c;也…

原型模式 java 深淺_JAVA設計模式---原型模式--淺客隆和深克隆

JAVA淺克隆和深克隆淺克隆&#xff1a;被復制對象的所有變量和原來相同&#xff0c;而所有的對其他對象的引用仍指向原對象。即如果復制的對象修改復制對象的變量&#xff0c;原對象不會改變。而修改引用的對象&#xff0c;二者均會發生改變。深復制(克隆)&#xff1a;被復制對…

SocketErrorCode:10022

在編寫.net的網絡服務器時&#xff0c;我使用了裸socket來實現。在windows上&#xff0c;或者在linux上通過.net core來跑時都沒有什么問題&#xff0c;但是通過mono運行調用socket.Bind()時卻總是報ErrorCode為10022的SocketException&#xff0c;表示參數無效。通過命令netst…