程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> singleton之我見

singleton之我見

編輯:Delphi

先和大家說說什麼是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,就允許創建,否則,就拋出異常


  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved