在多线程应用程序中使用带有继承的Singleton Design

时间:2014-09-22 10:50:05

标签: java multithreading inheritance design-patterns singleton

我有一个应用程序,代码有点像这样编写

public Interface SuperCLass{
//....to do some methods
}

public class BaseClass1 implements SuperCLass{
//....to do some methods
}

public class BaseClass2 implements SuperCLass{
//....to do some methods
}

现在在我的应用程序中,只有一个对象可以实例化为SuperClass引用,即同步单例。

现在,我可以加入

public static synchronized  SuperCLass getInstance(){
   //initialise
}

在任何基类中,但是我不能在SuperClass接口中包含这个声明,因为我无法使用超类的引用来获取基类的实例。 例如 我想这样做(这是一个非常模糊的例子)

BaseClass1 bc1 = BaseClass1.getInstance();

SuperClass sc = bc1.getInstance();

现在在代码的后面某处

bc1=sc.getInstance();

如何实现这一目标?

注意:多个线程将访问这些对象,因此同步是必需的

3 个答案:

答案 0 :(得分:1)

而不是使用单身人士为什么不使用依赖注入,例如:google guice。

Guice将为您创建超类的实例,然后您可以通过injector.getInstance()方法访问它。

答案 1 :(得分:0)

首先,您必须同步对实例的访问权限。有很多关于如何做到这一点的例子(例如线程安全发布只读或线程安全类)。

因为单例表示静态方法。您必须决定在某处使用哪种实现。通常这是通过setInstance方法。

答案 2 :(得分:0)

使Superclass方法返回Subclass类型的一种方法是通过Generics。

您将无法制作方法static,因为您无法覆盖static方法,因此这项技术无法帮助您,但它会像:

public interface SuperClass<T extends SuperClass<T>> {

    public T getInstance();
}

public class BaseClass1 implements SuperClass<BaseClass1> {

    @Override
    public BaseClass1 getInstance() {
        // Do my create.
    }
}

但是,对于您需要扩展基类的线程安全Singletons的特定需求,您可以使用enum作为它们的工厂并使用Multiton来确保它们中只有一个