如何动态的创建 Singleton 实例

2019-03-25 13:32|来源: 网路

如果一个类 ClassA 日后要有不同的实现,那么我可以将 ClassA 中的接口提取出来之后放入一个 InterfaceA 中,然后通过“工厂模式”在工厂中通过读取配置文件(获取对 InterfaceA 的实现类),和反射生成 InterfaceA 的实例(应用中同时只能存在 InterfaceA 的一“种”实现)。
但是现在又要求 InterfaceA 的所有实现必须是 Singleton 。这样便产生了不和谐的地方:Singleton 的 getInstance 方法是 static 的,并且无法从 InterfaceA 中指定。也就是说我只能在工厂中通过调用 Singleton 的构造函数去生成其实例,这样一来,我只能将Singleton 的 Constructor 声明为 public 的。这样就产生了“不是单例”的可能。
如何解决这问题?

问题补充:
chen_yongkai 写道
反射也能调用private的构造函数

这个的确可以解燃眉之急。并且通常可以达到预期。但是我觉得这个并不是好的解决方案。因为通过反射所获得的 private 成员,并不应该被调用。也就是说,这些东西是只能看不能依赖使用的。

相关问答

更多
  • 由于.NET中类型初始值设定项的性质,该代码是线程安全的。 类型初始化器保证只运行一次,如果两个线程同时运行它,一个会这样做,另一个会阻塞。 有关更多细节,请参阅关于单例实现的文章 。 That code is thread-safe due to the nature of type initializers in .NET. The type initializer is guaranteed to run exactly once, and if two threads try to run it a ...
  • 好的, 我的回答不是针对Guice的@Singleton特定的 ,但是如果您希望创建一个可通过所有活动访问的类,那么我认为,您必须使用Android的Application类。 (这是我个人对你的需求的看法) 做到这一点的方法是创建自己的android.app.Application的子类,然后在清单中的应用程序标签中指定该类 。 现在,Android会自动创建该类的一个实例,并使其可用于整个应用程序。 您可以使用Context.getApplicationContext()方法从任何上下文访问它(Acti ...
  • 如果您的Instance方法编写正确,那么您应该能够在Form2再次调用它并获得对Form1中创建的完全相同的对象的引用。 If your Instance method is written correctly, then you should be able to call it again in Form2 and get a reference to the exact same object that was created in Form1.
  • Singleton设计模式限制实例化,并确保JVM中只存在该类的一个实例。 换句话说,当您实现Singleton时,目的是确保每次调用getInstance()方法时都使用相同的实例。 关于你的代码,条件if (instance == null)是无用的,你的getInstance()方法相当于: public static JSONObject getInstance() { return instance; } Singleton design pattern restricts the ...
  • PHP中的单例仅对当前请求有效(因为HTTP是无状态的)。 如果要保留该对象的状态,请将其保存在会话中: class MySingleton { private static $instance; private static $you; private function __construct() { $this->you = "foo"; } public sta ...
  • 您正在寻找的是工厂模式。 让工厂缓存创建的实例并在它们存在时返回它们。 您可以通过多种方式实现它:静态方法,单例模式:枚举类或经典单例或静态依赖注入。 请注意,如果同时访问工厂,则实现还应考虑同步对缓存用户的对象的访问。 这是一个enum方式和线程安全的例子。 由枚举实现的接口(不是强制的,但更清晰,更可扩展): public interface IUserFactory { User getUser(String user); } Enum工厂: public enum UserFactor ...
  • 是的,为这样的服务创建一个单例绝对是个好主意,确保它在多线程访问时没有任何状态相关的问题 我会将这些DAO标记为Spring beans Yes it is definitely good idea to create a singleton for such services, make sure it doesn't have any state related issue when accessed by multiple threads I would have marked such DAOs a ...
  • 来自Mike Ash的网站是使用Grand Central Dispatch的另一种方式: + (id)sharedWhatever { static dispatch_once_t pred; static Whatever *whatever = nil; dispatch_once(&pred, ^{ whatever = [[Whatever alloc] init]; }); return whatever; } I just spotte ...
  • 在.NET中,应用程序或服务在名为AppDomain类所代表的应用程序域的沙箱中工作。 也就是说,静态资源仅可用于同一AppDomain并且不会跨进程共享。 另一方面,如果上述陈述不成立,关于两台服务器发生什么情况的问题,你真的想象两台服务器共享内存,2台进程访问同一内存吗? 静态成员从未在任何语言中表现出这种方式。 In .NET, an application or service works in a sandbox called application domain represented by t ...
  • 如果确实需要重置单例实例(实际上没有多大意义),可以将其所有内部成员包装在私有对象中,并通过显式的initialize()和reset()方法重新initialize() 。 这样,您可以保留单身,并提供某种“重置”功能。 If you really need to reset a singleton instance (which doesn't makes much sense actually) you could wrap all its inner members in a private obj ...