VB6是否可以实现单例设计模式?

VB6是否可以实现单例设计模式?,vb6,singleton,Vb6,Singleton,在VB6中是否可以实现单例设计模式 目前,我工作的遗留系统有大量IO由特定类的多个实例执行。希望清理所有这些实例,并仅由一个实例执行IO。这将允许我们向IO例程添加有意义的日志记录和监视。只需创建和使用一个对象实例即可。如何实现这一点取决于代码的功能和调用位置 在一个过程中,您可以在一个全局模块中使用一个实例,也可以使用一个工厂函数在第一次使用时创建它 如果由多个进程共享,则会使事情变得复杂,但可以使用ActiveX EXE和正在运行的对象表来完成。实现这一点的方法有很多,这取决于这是具有不同D

在VB6中是否可以实现单例设计模式


目前,我工作的遗留系统有大量IO由特定类的多个实例执行。希望清理所有这些实例,并仅由一个实例执行IO。这将允许我们向IO例程添加有意义的日志记录和监视。

只需创建和使用一个对象实例即可。如何实现这一点取决于代码的功能和调用位置

在一个过程中,您可以在一个全局模块中使用一个实例,也可以使用一个工厂函数在第一次使用时创建它


如果由多个进程共享,则会使事情变得复杂,但可以使用ActiveX EXE和正在运行的对象表来完成。

实现这一点的方法有很多,这取决于这是具有不同DLL的多项目应用程序还是单个项目

如果它是单个项目,并且有大量代码需要更改/破坏,那么我建议如下:

  • 给定一个到处实例化的类clsIOProvider,在同一个项目中创建一个模块modIOProvider
  • 对于clsIOProvider中定义的每个方法/属性,在modIOProvider中创建相同的方法集
  • 这些方法的实现以及类的实例数据应该从clsIOProvider克隆到modIOProvider
  • 应更改clsIOProvider中的所有方法和属性,以转发到modIOProvider中的实现。该类不应再具有实例数据
  • (可选)如果类需要使用构造函数和析构函数(初始化/终止),也将它们转发给modIOProvider。在modIOProvider中添加单个Instance计数器以跟踪实例数。当实例计数器从0变为1时运行初始化代码,当实例计数器从1变为0时运行终止代码
  • 这样做的好处是,您不必在使用clsIOProvider类的许多地方更改coe。他们很高兴地意识到对象现在实际上是一个单体


    如果从头开始编写一个项目,我会做一些不同的事情,但作为一种重构方法,我所概述的方法应该可以很好地工作。

    @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引用计数来初始化/终止底层的单例。是的,这是一种很好的替代方法,可以本着对现有代码零影响的精神进行初始化。