先和大家說說什麼是singleton模式的,它中文意應該為單一模式,但好別扭,也不知道是誰翻譯的
29796428(qiubole) 12:26:46
它屬於創建模式的一種
29796428(qiubole) 12:27:00
主要的作用就是確實一個類有且只有唯一的一個實例
29796428(qiubole) 12:27:10
這在實際當中,其實還是有一些用處的
29796428(qiubole) 12:27:41
比如,當前用戶這個類,我們就應該只保證其只有一份
29796428(qiubole) 12:27:57
一般我們在寫程序的時候,經常會為某一個類,或某一個窗體定義一個全局變量
29796428(qiubole) 12:28:06
但有了這個變局變量會帶來很多的問題
29796428(qiubole) 12:28:28
一是,無法使用方便的命名空間(這在Delphi中是沒有的,沒這概念)
29796428(qiubole) 12:28:39
二是,無法控制它的多次創建
29796428(qiubole) 12:28:53
利用singleton模式就能很好的解決這個問題
29796428(qiubole) 12:29:11
我們都知道,在Delphi中,只有類方法,而沒有類變量
29796428(qiubole) 12:29:25
所謂的類方法,就是其它如c++或Java叫的靜態方法
29796428(qiubole) 12:29:35
Delphi采用的是smalltalk的叫法,稱之為類方法
29796428(qiubole) 12:29:45
它的基本表現形式是 class procedure, class function
29796428(qiubole) 12:30:00
如果大家看過TObject這個對象的源碼的話,就應該比較了解
29796428(qiubole) 12:30:14
諸如InitInstance, InstanceSize等
29796428(qiubole) 12:30:35
但Delphi有一點,也是最讓人不爽的一點,它只提供類方法,不提供靜態屬性,就是static變量
29796428(qiubole) 12:31:00
那麼,我們就只好通過一種折 (這字不會打,媽的)的辦法
29796428(qiubole) 12:31:23
c#裡這樣實現
private static int i;
29796428(qiubole) 12:31:40
Delphi沒辦法,只好把它放到implementation下面
29796428(qiubole) 12:31:56
這裡的變量,只有當前單元的類的能訪問
29796428(qiubole) 12:32:11
很好了,我們要的就是它,把它當成static吧
29796428(qiubole) 12:32:48
singleton的目的是控制上面說的兩點,它又是如何做到的呢
29796428(qiubole) 12:33:07
其實,很簡單,還是要通過class function 來入手
29796428(qiubole) 12:33:29
當任何使用這個對象的時候,都必須通過某一個靜態方法(類方法)來訪問所要的對象的實例
29796428(qiubole) 12:33:42
我們只要提供如下方法,一切就OK了
29796428(qiubole) 12:34:11
type
TKillAll = class
class function Instance: TKillAll;
end;
29796428(qiubole) 12:35:06
implementation
var
locKillAll: TKillAll;
class function TKillAll.Instance: TKillAll;
begin
if locKillAll = nil then
locKillAll := TKillAll.Create;
result := locKillAll;
end;
29796428(qiubole) 12:35:16
ok,就是這麼簡單了,明白了沒有????
同時,一定要防止用戶直接調用create,設置一個局部變量,如果是由Instance 調用的Create,就允許創建,否則,就拋出異常