使用reflection的通用构建器模式类

使用generics实现构建器模式会很棒。 从理论上讲,可以使用reflection来实现以下目标:

MyClass myClass = GenericBuilder.aObject() .withThisProperty("foo") .withThatProperty(4) .build(); 

我已经做了以下代码:

  public class CursistBuilder { private Cursist cursist = null; private CursistBuilder() { cursist = new Cursist("username not set", "email not set"); } public static CursistBuilder aCursist() { return new CursistBuilder(); } public CursistBuilder withNaam(String name) { cursist.setGebruikersnaam(name); return this; } public CursistBuilder withEmail(String email) { cursist.setEmail(email); return this; } public Cursist build() { return cursist; } } 

如何实现这一目标?

它不是正确的构建器模式,因为对象不是在create function中create ,但您可以将其用作改进的参考

 public static class Builder { public final T instance; public Builder(Class clazz) throws InstantiationException, IllegalAccessException { super(); this.clazz = clazz; this.instance = clazz.newInstance(); } private final Class clazz; Builder setProperty(String name, Object value) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { Method method = clazz.getMethod("set" + name.substring(0, 1).toUpperCase() + name.substring(1), value.getClass()); method.invoke(instance, value); return this; } T create() { return instance; } } 

如何使用它:你通过将类传递给构造函数来创建构建器的实例

Builder builder = new Builder<>(MyClass.class);

然后使用方法setProperty(String name, Object value)来调用对象的setter,

你做了什么? 例如,为您的类传递一些默认值,不要使用非args构造函数

我不知道这是你想要的,但如果我是你,我会像下面这样实施//

主>>

 public class Main { public static void main(String[] args) { GenericBuilder gb = GenericBuilder.getInstance(); gb= gb.withThisProperty("String", "AAAAAA"). withThisProperty(4, 9). withThisProperty(5.8f, 6.7f). withThisProperty("Array", new ArrayList()).build(); System.out.println(gb.toString()); } }; 

VO >>

 public class GenericBuilder { private Map map; // Implementation of Singleton private GenericBuilder (){ map = new HashMap(); } private static class LazyLoader{ private static final GenericBuilder INSTANCE = new GenericBuilder(); } public static GenericBuilder getInstance(){ return LazyLoader.INSTANCE; } //End Singleton public GenericBuilder withThisProperty(Object key, Object param){ map.put(key, param); return this; } public Object get(Object key){ return map.get(key); } public GenericBuilder build(){ return this; } @Override public String toString() { StringBuffer returnVal = new StringBuffer(); Iterator iter = map.keySet().iterator(); while(iter.hasNext()){ Object key = iter.next(); returnVal.append("key >> " + key + " value >> " + map.get(key) + "\n"); } return returnVal.toString(); } } 

我重写toString()来显示其中的内容,并声明Map为某个地方赋值,如果你想要你可以用其他集合更改它。 谢谢/