亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 8687 | 回復: 24
打印 上一主題 下一主題

設計模式之Singleton [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-10-28 20:57 |只看該作者 |倒序瀏覽
快畢業(yè)了,最近一直找了一段時間的工作,參加了很多公司的面試,發(fā)現(xiàn)大公司對設計模式都比較感興趣,都問了我設計模式相關的東西,所以這段時間復習了一下設計模式,并做了一個總結(jié), 想和大家一起復習一下設計模式,歡迎大家補充和討論:
一、 單例(Singleton)模式
單例模式的特點:
    單例類只能有一個實例。
    單例類必須自己創(chuàng)建自己的唯一實例。
    單例類必須給所有其它對象提供這一實例。
單例模式應用:
    每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,避免兩個打印作業(yè)同時輸出到打印機。
一個具有自動編號主鍵的表可以有多個用戶同時使用,但數(shù)據(jù)庫中只能有一個地方分配下一個主鍵編號。否則會出現(xiàn)主鍵重復。
二、 Singleton模式的結(jié)構(gòu):

Singleton模式包含的角色只有一個,就是Singleton。Singleton擁有一個私有構(gòu)造函數(shù),確保用戶無法通過new直接實例它。除此之外,該模式中包含一個靜態(tài)私有成員變量instance與靜態(tài)公有方法Instance()。Instance方法負責檢驗并實例化自己,然后存儲在靜態(tài)成員變量中,以確保只有一個實例被創(chuàng)建。(關于線程問題以及C#所特有的Singleton將在后面詳細論述)。
三、 在什么情形下使用單例模式:
使用Singleton模式有一個必要條件:在一個系統(tǒng)要求一個類只有一個實例時才應當使用單例模式。反過來,如果一個類可以有幾個實例共存,就不要使用單例模式。
注意:
不要使用單例模式存取全局變量。這違背了單例模式的用意,最好放到對應類的靜態(tài)成員中。
不要將數(shù)據(jù)庫連接做成單例,因為一個系統(tǒng)可能會與數(shù)據(jù)庫有多個連接,并且在有連接池的情況下,應當盡可能及時釋放連接。Singleton模式由于使用靜態(tài)成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。
四.Singleton的代碼實現(xiàn)
(1)C++版本
#include <iostream>

using namespace std;

class Singleton
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;static Singleton *Instance()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (NULL == _instance)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_instance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _instance;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;void method1(){cout << " method1 is done~ " << endl;};

protected:
&nbsp;&nbsp;&nbsp;&nbsp;Singleton(void){ cout <<" Singleton() " << endl;};
&nbsp;&nbsp;&nbsp;&nbsp;virtual ~Singleton(){cout << "~singletont()" <<endl; }

&nbsp;&nbsp;&nbsp;&nbsp;static Singleton* _instance;
};

//static 變量需要在類定義外面進行初始化


Singleton* Singleton::_instance = NULL;


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;cout << "Hello, world~!" << endl;
&nbsp;&nbsp;&nbsp;&nbsp;Singleton::Instance()->method1();
&nbsp;&nbsp;&nbsp;&nbsp;Singleton::Instance()->method1();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}




(2) C#版本



sealed class Singleton
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;public static readonly Singleton Instance = new Singleton();
}
&nbsp;
//實現(xiàn)延遲初始化


public sealed class Singleton
&nbsp;&nbsp;{
&nbsp;&nbsp;Singleton()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;public static Singleton GetInstance()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Nested.instance;
&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;class Nested
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Explicit static constructor to tell C# compiler


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// not to mark type as beforefieldinit


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static Nested()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;internal static readonly Singleton instance = new Singleton();
&nbsp;&nbsp;}
}
&nbsp;

(3)JAVA版本
Public class Singleton{
&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance;
&nbsp;&nbsp;&nbsp;private Singleton(){}
&nbsp;&nbsp;&nbsp;public static synchronized Singleton getInstance(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(uniqueInstance == null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;// other useful methods here

}
/*這種寫法可以實現(xiàn)單件模式,既簡單又有效,利用了synchronized的同步方法。但是會帶來嚴重的性能問題。同步一個方法可能造成程序執(zhí)行效率下降100倍。因此,如果將getInstance()放到頻繁運行的地方,就要重新考慮自己的設計了。
*/

&nbsp;


五參考資料

1.http://www.cppblog.com/SoRoMan/a ... 0140.html?opt=admin

2. http://leo-faith.javaeye.com/blog/177779

[ 本帖最后由 scuwb 于 2008-10-28 20:58 編輯 ]

評分

參與人數(shù) 1可用積分 +2 收起 理由
scutan + 2

查看全部評分

論壇徽章:
0
2 [報告]
發(fā)表于 2008-10-28 21:00 |只看該作者
無語~~~~~

論壇徽章:
0
3 [報告]
發(fā)表于 2008-10-28 21:10 |只看該作者

回復 #2 YangFree 的帖子

Why?

論壇徽章:
0
4 [報告]
發(fā)表于 2008-10-28 21:19 |只看該作者
樓主 單例模式有優(yōu)勢嗎? 其他模式呢?

論壇徽章:
0
5 [報告]
發(fā)表于 2008-10-28 21:45 |只看該作者

回復 #4 tonghuasanren 的帖子

這些設計模式的東西,只有在開發(fā)項目的實際過程中才會用上,一般寫點小程序是用不上的~~
還有工廠模式,觀察者模式,橋模式等比較經(jīng)典的模式,等我整理了后會及時發(fā)出來的哈~~~

論壇徽章:
0
6 [報告]
發(fā)表于 2008-10-28 21:50 |只看該作者
頂樓主!

論壇徽章:
0
7 [報告]
發(fā)表于 2008-10-28 22:03 |只看該作者
可以看看MCD(Modern C++ Design)中關于單件的討論

論壇徽章:
0
8 [報告]
發(fā)表于 2008-10-28 22:03 |只看該作者
模式無處不在.

論壇徽章:
0
9 [報告]
發(fā)表于 2008-10-28 22:10 |只看該作者
原帖由 scuwb 于 2008-10-28 20:57 發(fā)表
快畢業(yè)了,最近一直找了一段時間的工作,參加了很多公司的面試,發(fā)現(xiàn)大公司對設計模式都比較感興趣,都問了我設計模式相關的東西,所以這段時間復習了一下設計模式,并做了一個總結(jié), 想和大家一起復習一下設計模式,歡 ...

if (NULL == _instance)
        {
            _instance = new Singleton();
        }
線程不安全代碼

論壇徽章:
0
10 [報告]
發(fā)表于 2008-10-28 22:14 |只看該作者
原帖由 blizzard213 于 2008-10-28 22:10 發(fā)表

if (NULL == _instance)
        {
            _instance = new Singleton();
        }
線程不安全代碼

嗯.
加上線程安全這些代碼就有點龐大了.



[ 本帖最后由 scutan 于 2008-10-28 22:28 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP