使用枚举创建安全的工厂实例

时间:2020-07-19 04:29:06

标签: java

我编写了用于为线程安全工厂创建创建多个实例的代码:

public class XWebserviceObjectFactoryCreator {
    
}

但是,代码对我来说似乎很重复,对此并不满意。是否可以使用enum(或其他方式)使其更具可读性?

2 个答案:

答案 0 :(得分:2)

由于该示例显示所有类均具有无参数构造函数,因此可以使用Class.newInstance方法,例如:

private static Map<Class<?>, Object> instances = new HashMap<>();

public static <T extends Object> T getObjectFactoryInstance(Class<T> clazz)  {
    
    Object result;

    if ((result = instances.get(clazz)) == null) {                
            synchronized (instances) {

            if ((result = instances.get(clazz)) == null) { 
                 try {
                       result = clazz.newInstance();
                       instances.put(clazz, result)
                   } catch (InstantiationException |  IllegalAccessException e) {
                         // do something
                    }
              }
         }
    }

    return (T)result;
  }

抱歉,如果布局或语法不可用,但是我不在电脑前,可以通过电话进行操作-但希望您能理解!

如果任何类的确在其构造函数中需要参数,则必须使用反射来调用构造函数。

最后,请注意,我将clazz的声明从Class <?>修改为Class ,以使泛型通过将输出绑定到给定的Class来验证调用方。

答案 1 :(得分:2)

您可以将Abstract Factory设计模式与Enum一起使用,其中Sales2ObjectFactory,OrderingObjectFactory,Settings2ObjectFactory和SettingsObjectFactory本身可以是具有通用接口的工厂。

然后,您可以使用Enum获取这些工厂之一的实例。

public static class FactoryMaker {

  public enum FactoryType {
    SALES2OBJECT, ORDERING,SETTING2OBJECT,SETTINGS
  }

  public static CommonFactory makeFactory(FactoryType type) {
    switch (type) {
      case SALES2OBJECT:
        return new Sales2ObjectFactory();
      case ORDERING:
        return new OrderingObjectFactory();
      case SETTING2OBJECT:
         return new Settings2ObjectFactory();
      case SETTINGS:
          return new new SettingsObjectFactory();
      default:
        throw new IllegalArgumentException("FactoryType not supported.");
    }
  }
}

请检查:: :: https://java-design-patterns.com/patterns/abstract-factory/

相关问题