使用类方法控制实例的唯一性

【前车之鉴】通用解决Nacos Open API手动上下线不生效,创建实例后先被设置不健康而后被自动剔除集群,以及控制台无法删除实例Instance 超详细解决方案 那么使用这个API进行注册,的确可以立刻看到结果,但是细心的你如果观察15秒左右【Nacos默认心跳周期15s】,就会发现没有心跳,被设置为不健康 随后被自动清除任务扫描不健康实例 直接删除。 阅读详情

使用类方法控制实例的唯一性

CST 2005-7-29

 

文档目的

在面向对象编程中,出于各种原因,有时我们希望控制一个类的实例仅有一个存在于内存中。例如我在编程中遇到一个实际情况,程序的配置数据保存在XML文档中,需要写一个XML配置文件解析类。由于读入的数据可能很庞大,而且在程序每个模块中都用到该解析类的实例,那么如果每次都创建一个实例并重新读入数据,效率就不令人满意了。

 

 

类方法

我们可以通过类方法(Class Method)实现实例创建的控制,其实也有许多其他的方法。这里我先介绍“类方法”的实现。

 

如下是DELPHI对类方法的定义:

A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the reserved word class. For example,

 

type

  TFigure = class

  public

    class function Supports(Operation: string): Boolean; virtual;

    class procedure GetInfo(var Info: TFigureInfo); virtual;

    ...

  end;

 

The defining declaration of a class method must also begin with class. For example,

 

class procedure TFigure.GetInfo(var Info: TFigureInfo);

begin

  ...

end;

 

In the defining declaration of a class method, the identifier Self represents the class where the method is called (which could be a descendant of the class in which it is defined). If the method is called in the class C, then Self is of the type class of C. Thus you cannot use Self to access fields, properties, and normal (object) methods, but you can use it to call constructors and other class methods.

A class method can be called through a class reference or an object reference. When it is called through an object reference, the class of the object becomes the value of Self.

 

定义一个类方法就是在将一个方法生命在PUBLIC段中,并加上class前缀。这样的方法可以由类直接调用,而不需要先创建类的实例。比如构造函数Create就是一个类方法,我们在创建对象实例的时候这样写:

MyObject:=TmyClass.Create;

此时的Create方法由类TmyClass调用。

 

实现方法

我们实现的目的就是不以平时的对象访问模式调用对象

Myobject:=TmyClass.Create(self);

Try

  With Myobject do begin

//do something

  end;

finally

  FreeAndNil(Myobject);

End;

 

而是使用一个类方法GetInstance来间接获取对象实例,这个唯一的对象实例被申明在类的单元文件内(后文回详细说明),在GetInstance函数中判断该实例是否被创建赋值,如果没有,则调用构造函数创建;如果已创建,则直接返回该实例。

这里,我们需要将构造函数Create申明在private段中,仅能由GetInstance判断调用。TmyClass.GetInstance函数返回值为TmyClass类型的变量,如果Tmyclass继承自Tcomponent的话,create方法需要一个Aowner参数,因此我为GetInstance增加一个Aowner参数。

 

GetInstance类方法的实现不影响类中其他方法的实现,一般我们在调试设计阶段不进行类方法的考虑,而是公开需要测试的对象方法以便于调试。最后要发布类的时候,我们做如下改动:

1.        在类单元文件中,但是在类定义之外申明唯一对象变量。
我的做法是在
implementation
var mySoloObject:TMyClass;

2.        隐藏构造函数
将constructor函数申明在private段中

3.        增加一个GetInstance类方法,定义在Public段中,判断mySoloObject是否被创建。

 

具体代码如下:

……

//类定义

TConfigReader = class(TComponent)

        private

            FXMLDoc: TXMLDocument;       

            constructor Create(AOwner:TComponent); override;

        public

            FCtrlInfoList:TObjectList;

            function OpenXMLFile(const APath:string):boolean;

            function ReadCtrlInfoToList: Integer;

            class function GetInstance(AOwner:TComponent):TConfigReader;

        end;

//唯一对象变量

 

implementation

 

var

ConfigReaderSolo:TConfigReader;

 

//函数定义

class function TConfigReader.GetInstance(AOwner:TComponent):TConfigReader;

begin

    if ConfigReaderSolo=nil then

       ConfigReaderSolo:=TConfigReader.Create(AOwner);

    Result:=ConfigReaderSolo;

end;

 

访问方法

做了如上修改以后,我们的类就可以实现唯一实例的判断以及创建控制。

在主调单元中,我们想往常一样uses类所在的unit文件,相较普通的对象访问方式,我们采用类似如下的代码:

TConfigReader.GetInstance(Self).MyMethod1;

TConfigReader.GetInstance(Self).MyMethod2;

MyVar:= TConfigReader.GetInstance(Self).MyFunc1;

MyObject:= TConfigReader.GetInstance(Self).Member1;

……

 

小结

对数据的隐藏、共享、保护是OO编程的优点,利用不同的数据访问级别隐藏相应的方法、成员,可以更大限度控制数据的安全性,也可以让程序按照我们想要的方式运行。类方法和类成员可以在对象没有创建的时候就被访问,因此可以越过对象本身来判断其创建与否。定义在单元内但类外的对象变量可以全局于单元内的所有类。

 

在我的YAHOO公文包中有这片文章相关的代码,欢迎下载。也希望大家给我提出改进意见。

解析数论基础:唯一性定理 解析数论基础:唯一性定理 1.背景介绍 解析数论是数论的一个分支,主要研究数论问题的解析方法。它结合了分析学和数论的工具,解决了许多经典的数论问题。唯一性定理是解析数论中的一个重要概念,它在许多数论问题中起到了关键作用。本文将深入探讨唯一性定理的核心概念、算法原理、数学模型、实际应用以及未来发展趋势 阅读详情

相关推荐

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

JavaScript单例模式:控制实例的唯一性和全局访问

本文将介绍JavaScript单例模式的概念和实现方法,以及它在实际开发中的应用。JavaScript单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的方式。了解单例模式的使用方法和场景对于开发者来说具有重要意义。在实际项目中,可以根据需求选择合适的方法来实现单例模式。

你若盛开,清风自来 1315

YOLOv8实战:5分钟搞定Windows环境下的目标检测模型部署(附常见报错解决方案)

本文详细介绍了在Windows环境下快速部署YOLOv8目标检测模型的实战指南,包括环境配置、模型加载、快速验证及常见报错解决方案。通过5分钟快速入门教程,帮助开发者高效实现计算机视觉应用,特别适合需要快速上手的AI开发者。

weixin_30566063的博客 556

标准工业控制编程语言IEC61131-3简述

IEC61131-3定义了PLC的软件结构、编程语言和程序执行方式,它综合了世界上广泛流行的编程语言的特定,并使其成为一种面向未来的PLC编程语言。 IEC61131-3提供了5种PLC的标准编程语言,其中有3种图形语言:梯形图(LD)、功能块图(FBD)和顺序功能图(SFC);两种文本语言:结构化文本(ST)和指令表(IL)。

追求。 4万+

从零到一:揭秘BlueROV2机械爪背后的Pixhawk舵机控制艺术

本文详细解析了如何基于Pixhawk飞控系统为BlueROV2水下机器人构建可靠的舵机控制系统。从硬件选型、ArduSub固件配置到供电安全与故障排除,全面揭秘机械爪背后的控制艺术,为水下机器人爱好者提供实用指南。

ol78901234的博客 242

C#上位机实战:借助NetToPLCSim与西门子S7-1200仿真通信全攻略

本文详细介绍了如何使用C#开发上位机程序,通过NetToPLCSim与西门子S7-1200进行仿真通信的全过程。从环境准备、PLC仿真环境搭建、网络配置到C#代码实现,提供了完整的实战指南和常见问题解决方案,帮助开发者快速掌握工业自动化通信技术。

weixin_30596343的博客 440

Java经典编程300例之实例046 单例模式的应用

实例说明 中国历史上的皇帝通常仅有一人。为了保障其唯一性,古人采用增加“防伪标识”的办法,如玉玺。更简单的办法是限制皇帝的创建。本实例使用单例模式来保证皇帝的唯一性。

2271

PSCAD学习笔记(1)Project Settings(重点snapshot设置)

若不勾选,则横坐标为实际时间2-7s,故障显示在第3s发生。图片中时间坐标轴显示为0-5s,故障时刻显示为第1s,即0-1s展示系统稳态,1-5s展示系统发生故障后的暂态响应,如何通过快照文件实现?勾选该项后,使用快照文件启动仿真会将仿真起始时间强制设置为0s,反之不勾选则依据快照文件保存的时间轴继续(即坐标为实际时间)。如果已有的快照文件保存的是0s至5s的仿真内容,则仿真运行时间从5s开始,到10s结束。如果已有的快照文件保存的是0s至2s的仿真内容,则仿真运行时间从2s开始,到7s结束;

gwenh的博客 7343

单例模式【Singleton Pattern 】

博客地址  http://blog.youkuaiyun.com/ftx2540993425   下面横线以上内容是借鉴别人的,为了表达对作者的敬意,不做不恰当的修改,我个人的总结在后面。   这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝

菜鸟的飞翔 592

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 626

《深入掌握PostgreSQL数据库》 - 专栏介绍和目录

本专栏系统讲解PostgreSQL数据库的全栈知识,涵盖基础入门到高级实战。内容分为语言基础与进阶、核心原理、高可用架构、性能优化、运维管理、扩展开发等多个模块。从安装配置、数据类型选择到窗口函数、CTE等高级特性,再到索引优化、执行计划分析等性能调优技巧,全面解析PostgreSQL的核心功能。同时深入探讨MVCC机制、WAL日志、并发控制等底层原理,并分享高可用架构设计、备份恢复等运维实践。适合各层次开发者系统学习PostgreSQL,掌握这一强大开源数据库的关键技术。

数据知道的博客 3451

AI项目成功三要素:算法、算力与数据协同优化

在人工智能领域,算法、算力和数据构成了技术落地的三大支柱。算法作为AI系统的核心大脑,其架构设计和优化策略直接影响模型性能,如Transformer在NLP/CV领域的统一应用。算力则是支撑模型训练与推理的燃料,合理选择硬件平台和优化分布式训练能显著提升效率,例如使用Deepspeed实现低成本高效训练。数据质量决定了模型的上限,通过特征工程和数据增强等手段可以充分释放数据价值。这三者的动态平衡是项目成功的关键,例如在工业质检场景中,通过算法改进和算力优化可将推理速度提升数倍。理解这些基础要素的协同原理,对

weixin_30832405的博客 446

AWS DevOps Agent 完全指南

AI 驱动的 SRE 队友,7×24 自主调查告警、定位根因、生成修复方案、预防未来故障。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 381

自定义元类控制类的实例化行为的应用

#实现方式一class Mysql: __instance = None # __instance = s def __int__(self): self.post = 1.235 self.host = 3 @classmethod def singleton(cls): if not cls.__instance: ...

weixin_30497527的博客 89

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

iOS设计模式——单例模式

单例模式用于当一个类只能有一个实例的时候,通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。 单例模式需要达到的目的 1.封装一个共享的资源 2.提供一个固定的实例创建方法 3.提供一个标准的实例访问接口 单例模式的创建 本文以创建一个MySi...

dingzunheng9619的博客 107

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python 面向对象oop

1 oop 对象世界观 -- oop是目前人类认知最接近实际生活的语言 一切事务皆对象 对象有运动规律和内部状态 对象之间可以相互调用 2.面向对象 唯一性:对象具有唯一性,不存在两个相同的对象,除非他们是同一个对象 可以分类性 : 对象可以分类 3.oop 分类 封装 继承 多态 具体类: 结构   classs 类名:     类体 ...

weixin_30786617的博客 150

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python oop示例_python 面向对象oop

1 oop 对象世界观 -- oop是目前人类认知最接近实际生活的语言一切事务皆对象对象有运动规律和内部状态对象之间可以相互调用2.面向对象唯一性:对象具有唯一性,不存在两个相同的对象,除非他们是同一个对象可以分类性 : 对象可以分类3.oop 分类封装继承多态具体类:结构classs 类名:类体创建对象使用类名(__init__ 函数除第一个参数外的参数列表)创建对象的时候 实际执行了__i...

weixin_30068505的博客 241

OC_学习_类方法\实例方法

方法是类的行为,写在接口和实现两个文件中。在接口部分声明方法,在实现部分实现方法。 1、类方法与实例方法 Objective-C中的类可以声明两种类型的方法:实例方法和类方法。实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,也就是说,不需要你创建一个实例。 +表示类方法,就是类调用方法,不依赖与任何对象

bin神话 938

控制类实例的唯一性

<br />为了防止多次创建对象,生成实例,可以在类中追加静态方法控制实例的唯一性。<br /> <br />public class ChartController<br />{<br />    public static ChartController GetInstance()<br />    {<br />        if (poControl == null)<br />        {<br />            poControl = new ChartController()

OppZero的专栏 766

白话设计模式之单例模式:确保实例唯一性的编程智慧

大家好。软件开发的学习过程中,设计模式的学习至关重要,可其中的概念和应用却常常让人摸不着头脑。我自己也在不断摸索,所以希望通过这篇文章,和大家一起深入探讨单例模式,在交流分享中共同进步,让设计模式不再是学习路上的“拦路虎”。

wj_rdk的博客 1680

高并发下如何保证数据表中唯一性

在说明问题之前我们先来看一段经常性使用的代码 function fun(){ 开启事务 try{ var count = find(); if(count<1){ insert(); } 提交事务 }catch(e){ 事务回滚 } } ...

ruixing222的专栏 3702

【mysql】唯一性约束unique

如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。#错误:Duplicate entry ‘tom@126.com’ for key ‘test2.uk_test2_email’在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。可以看到,没有写 约束名 的时候以定义的列名 id 来命名。删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。删除唯一约束只能通过删除唯一索引的方式删除。添加唯一性约束的列上也会自动创建唯一索引。

2509_92430519的博客 1044

白话设计模式之单例模式:保证实例唯一性的编程技巧

大家好,在软件开发的学习道路上,设计模式是提升编程能力的关键部分,但其中的概念和应用常常让人感到困惑。我也在不断学习和探索,所以希望通过这篇文章,和大家一起深入研究单例模式,在交流和分享中共同进步,让设计模式不再是难以理解的“神秘领域”。

wj_rdk的博客 1359

mac地址唯一性_MAC地址的唯一性如何实施?

mac地址唯一性With the huge volume of Internet connected devices that have been and will continue to be produced, how is the uniqueness of any ‘given’ MAC address enforced? Today’s SuperUser Q&A post ha...

1991

Hyperid实战案例:如何在分布式系统中确保ID唯一性

在分布式系统开发中,**ID唯一性**是确保数据一致性的关键挑战。Hyperid作为一款超快速的唯一ID生成工具,同时支持Node.js和浏览器环境,能够为分布式应用提供高效可靠的ID解决方案。本文将通过实战案例,详细介绍如何利用Hyperid在分布式系统中实现ID的唯一性保障。 ## 为什么选择Hyperid? Hyperid的核心优势在于其**极致性能**和**分布式友好设计**。从[pa

gitblog_00041的博客 825
上一篇: TValueListEditor 控件使用方法
下一篇: 实现一个热键注册编辑的类
mrtechno
博客等级 码龄21年 9粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值