中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
singleton之我见
作者:未知 时间:2004-12-30 12:12 出处:Blog 责编:chinaitpower
              摘要:暂无

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有