通过接口暴露单例类的正确方法

时间:2015-10-05 19:45:08

标签: java spring design-patterns singleton

我有一个单例类,必须使用interface作为服务公开给其他应用程序。

例如:

public class MySingleSingletonClass{

    private static final MySingleSingletonClass THIS_INSTANCE = new MySingleSingletonClass();

    private MySingleSingletonClass() {}

    public static MySingleSingletonClass getInstance(){
       return THIS_INSTANCE;
    }

    //do other staff
   public int methodA(){
     //some service
   }

}

现在,如果我想通过接口公开这个类的所有服务,这是我的第一次尝试:

public interface MyServiceInterface{
    int methodA();
    MyServiceInterface getInstanceThroughService(); 
}

当MySingleSingletonClass实现此接口时:

public class MySingleSingletonClass implements MyServiceInterface{

    private static final MySingleSingletonClass THIS_INSTANCE = new MySingleSingletonClass();

    private MySingleSingletonClass() {}

    public static MySingleSingletonClass getInstance(){
       return THIS_INSTANCE;
    }

   @Override
   public int methodA(){
     //some service
   }

   @Override
   MyServiceInterface getInstanceThroughService(){
     return MySingleSingletonClass.getInstance();
   }

}

我发现这种实现有两个问题,

首先如果我使用像spring这样的框架,并且我尝试获取MyServiceInterface类型的bean将如何实例化该类?我读到春天仍然会使用反射来呼叫班级的私人承包商。这个例子还是单身吗?

第二次,如果Spring已经给我实例,我没有看到使用实例本身调用getInstanceThroughService()方法的意义。感觉这个实现存在问题。

谢谢

3 个答案:

答案 0 :(得分:4)

默认情况下,典型的春豆是单身!

@Service
public class MySingleSingletonClass{

   public int methodA(){...}
}

@Service
public class ConsumerA{
   @Autowired
   private MySingleSingletonClass mssc;
}

@Service
public class ConsumerB{
   @Autowired
   private MySingleSingletonClass mssc;
}

在这种情况下,您将拥有3个bean: - ONE MySingleSingletonClass - 一名消费者A. - 一个ConsumerB

msscConsumerA中的引用ConsumerB将指向MySingleSingletonClass的SAME实例。

所以你不需要实现标准的Singleton模式,Spring会为你做。

答案 1 :(得分:0)

你可以使用spring的工厂方法http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html来告诉spring使用getInstanceThroughService()来获取新的实例,而这些实例又会给你相同的缓存实例,从而维护你的单例。

但是,如果你使用spring,那么你不需要自己维护单例对象。 Spring会自动执行此操作(除非您的类在同一个jvm / classloader中的spring容器之外使用)。

答案 2 :(得分:0)

Spring是一个实现名为inversion of control(或IoC)的设计模式的框架。 IoC的一个应用是允许外部框架配置和实例化应用程序的各个部分,实际上,这是spring bean的功能。 Spring bean允许您使用配置文件配置应用程序资源,并访问应用程序中的这些资源。

Singletons(和原型bean)由spring管理,因此不需要自己实现Singleton设计模式。您只需要创建一个符合Spring的bean并在Spring配置中声明它。然后,您可以从应用程序上下文中访问它。

您的bean仍然可以像往常一样实现接口,并且您可以在应用程序中使用该接口。