先和大家说说什么是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,就允许创建,否则,就抛出异常 
|