在Java(OOP)中使用多个请求共享同一实例

时间:2015-07-10 18:56:20

标签: java oop design-patterns

我有一个类,其单个实例需要由Java中的多个类使用。我找到了两个相同的解决方案: 1.将实例作为方法参数传递 2.使用静态工厂

我的问题是,如果我使用静态工厂,当我使用静态方法时,如何区分传入的请求。我想避免第一个解决方案,因为有许多类将使用此实例。另外,如果不是上面提到的,请推荐最佳设计。

代码示例:

 class MyClass{


        Map<String, List<String>> myMap=new ConcurrentHashMap();

           public static void addToMap(String key, String value){
              if(myMap.containsKey(key)){
                  List<String> stringList=myMap.get(key);
                 stringList.add(value);
               }
               else{
                 myMap.put(key,value);
               }
           }
    }

我想在程序执行时在很多地方执行这个add方法,例如:

方法addEmployee():

if(employeeName==null){
   MyClass.addToMap("ER101", "Name Error");
}
Method insertInDB():
catch(SQLException e){
   MyClass.addToMap("SQL", "Error Occurred in DB Operation");
}

由于

3 个答案:

答案 0 :(得分:2)

有许多方法可以使同一个类的实例可用于不同的调用者,例如线程或请求。

您可以做的最简单的事情之一就是创建一个单例,如上所示。单例的问题在于它们只能存在其中之一,因为它们通常被设置为强制执行它们的单个实例。

更好的是创建您的实例,并将其传递给需要它的东西。如果您正在创建Web应用程序或类似应用程序,则可以使用SpringFramework等依赖注入框架来实现此目的。

在需要它的地方注入实例意味着用虚拟实例替换此实例将更容易进行测试,并且在测试期间,您将能够创建以不同方式配置的此类的许多实例进行测试。

答案 1 :(得分:0)

正如 12dollar 所说:使用Singleton设计模式,并向Singleton类请求该实例:

count = 0            
while count!=12 or count!=6: 
    count = count + 1
    print(count)

然后你可以拨打public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // Exists only to defeat instantiation. } public static ClassicSingleton getInstance() { if(instance == null) { instance = new ClassicSingleton(); } return instance; } }

答案 2 :(得分:0)

最好的设计是让你的班级成为Singleton班级。 根据您的使用情况,我认为您可以按照以下步骤进行操作

  • 将您的构造函数设为私有。
  • 然后,在该类中有一个静态函数来返回类的实例化对象。

  • 你可以拥有自己的if(classobj == nul)检查来验证它是否已经实例化(仅在第一次调用时它将为null,进一步调用它不会为null)并返回该对象。 / p>

干杯:)