我编写了用于为线程安全工厂创建创建多个实例的代码:
public class XWebserviceObjectFactoryCreator {
}
但是,代码对我来说似乎很重复,对此并不满意。是否可以使用enum
(或其他方式)使其更具可读性?
答案 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
答案 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/