我正在尝试设计一种更灵活的单例模式。
我要解决的问题如下:
- 单例模式不能方便地进行测试。
- 它们滥用面向对象的方法,不允许继承,代码变得线性,很多开发人员倾向于过度使用它们。
- 它们仅限于一个实例,即在不复制类本身的情况下重复相同的机制(例如,ThreadPool作为每个应用程序的单例运行,但每个应用程序都有自己的实例)。
现在,我提出的解决方案如下:
- 将Singleton类作为常规公共类,具有内部构造函数(仅可由相同包中的类访问)。
- 与每个面向产品的类一样,所有静态属性和静态常量都移动到内部的
SingletonShared
类中,并将其作为参数传递给Singleton的构造函数。这两者隐藏在一个名为SingletonFactory
的公共类后面,该类具有静态方法getInstance(key)
。 - 如果我们处理的是需要其自己独特参数集的更复杂系统,则在
SingletonFactory
中添加了一个名为setAdapter(adapter)
的静态方法。使用getShared(key)
方法,实现ISingletonAdapter
接口的类应返回该实例的SingletonShared
值(例如,将Xml文件传递给SingletonXmlAdapter
的构造函数,并根据其给定的键反序列化某个节点)。
所有上述内容都打包成一个Singleton
包。
现在,为了进行测试,有一个将Singleton标记为内部类并使其实现公共接口ISingleton
的选项。
问题:
- 这个解决方案可行吗?
- 是否有更好/更清晰/更短的方式来实现相同的效果?
- 哪个版本最好(Singleton作为内部类还是构造函数作为内部类)?
谢谢!