VB6是否可以实现单例设计模式?
在VB6中是否可以实现单例设计模式VB6是否可以实现单例设计模式?,vb6,singleton,Vb6,Singleton,在VB6中是否可以实现单例设计模式 目前,我工作的遗留系统有大量IO由特定类的多个实例执行。希望清理所有这些实例,并仅由一个实例执行IO。这将允许我们向IO例程添加有意义的日志记录和监视。只需创建和使用一个对象实例即可。如何实现这一点取决于代码的功能和调用位置 在一个过程中,您可以在一个全局模块中使用一个实例,也可以使用一个工厂函数在第一次使用时创建它 如果由多个进程共享,则会使事情变得复杂,但可以使用ActiveX EXE和正在运行的对象表来完成。实现这一点的方法有很多,这取决于这是具有不同D
目前,我工作的遗留系统有大量IO由特定类的多个实例执行。希望清理所有这些实例,并仅由一个实例执行IO。这将允许我们向IO例程添加有意义的日志记录和监视。只需创建和使用一个对象实例即可。如何实现这一点取决于代码的功能和调用位置 在一个过程中,您可以在一个全局模块中使用一个实例,也可以使用一个工厂函数在第一次使用时创建它
如果由多个进程共享,则会使事情变得复杂,但可以使用ActiveX EXE和正在运行的对象表来完成。实现这一点的方法有很多,这取决于这是具有不同DLL的多项目应用程序还是单个项目 如果它是单个项目,并且有大量代码需要更改/破坏,那么我建议如下:
如果从头开始编写一个项目,我会做一些不同的事情,但作为一种重构方法,我所概述的方法应该可以很好地工作。@MarkJ-全局变量的问题是,如果不是modGlobal.IOObject什么都没有,那么必须添加modGlobal.IOObject=New clsIOObject,然后在每次使用它之前设置modGlobal.IOObject=New。对象终止也同样困难(如果需要的话)。是的,但您可以使用工厂函数,该函数允许您通过get和release函数进行半引用计数。@tcarvin@Deanna我支持Deanna。一个专用模块级变量
mobjSingleton
,以及一个用于返回模块级变量的全局函数。全局函数将执行如果不是mobjSingleton,则设置mobjSingleton=New clsSingleton
。如果需要,您可以有一个全局发布子版本,它将设置mobjSingleton=Nothing
。但是需要注意的是,这不会终止以前由客户端获得的引用。@MarkJ如果用例是IOObject一旦创建,就不需要清理(终止中没有代码),那么您的解决方案会更简单。但是一旦客户端代码(创建和使用IOObject的代码)必须开始手动调用aquires和release来进行psuedo引用计数,我就不会使用这种方法。OP表示,这一代码无处不在,需要在很多地方推动这一变化。我的建议虽然稍微复杂一些,但对客户端代码没有影响。对于一个对现有代码影响最小的方法来说,这完全取决于…+1。尽管您可以(1,2)创建一个实现clsIOProvider的新类clsConcreteIOProvider。(3) 将所有实现从clsIOProvider移动到clsIOProvider(4)更改所有方法和属性以转发到clsConcreteIOProvider的私有实例。(5) 在类_Initialise中,使用Deanna答案中的技术将clsConcreteIOProvider的私有实例设置为单个实例(singleton)。一个好处是,如果需要的话,您可以依靠VB/COM引用计数来初始化/终止底层的单例。是的,这是一种很好的替代方法,可以本着对现有代码零影响的精神进行初始化。