父类(super class)中的java静态工厂

标签 java factory

我有一些java beans(它们有private属性和getter/setter方法)。并且可以使用 Map<String, Object> 构建实例在构造函数中像这样:

public class A {
    private String name;
    private String gender;
    ...

    public A(Map<String, Object> m){
        BeanInfo beanInfo = Introspector.getBeanInfo(this.getClass());
        for(PropertyDescriptor pd: beanInfo.getPropertyDescriptors()){
            if(pd.getName().equals("class")){
                continue;
            }
            Method setter = pd.getWriteMethod();
            if(setter != null && m.get(pd.getName())!=null){
                setter.invoke(this,m.get(pd.getName()));
            }
        }
    }
    getter()/setter()
        ...

}

但是当有一些 child 的类(class)延长类(class)时A ,每次写一个新的子类时都应该有一个对应的构造函数:

public class B extends A {
   public B(Map<String, Object> m){
       super(m);
   }
}

我觉得这很烦人,我想在父类中构建一个静态工厂方法 A一次性执行此操作(也许类 A 中有类似这样的代码?):

  public static fromMap(Map<String, Object>){
      return new // I really don't have a clue how to write this.
  }

有人可以给我一个关于如何编写这个工厂方法的提示吗?或者说这可能吗?也许有一些通用的技巧?

最佳答案

您想要使用的方法不是最好的方法。事实上,如果你将工厂方法放在父类(super class)中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,则每次添加新子类型时都必须更改它。而且,这违反了单一责任原则

您可以使用工厂方法,但您必须将其提取出来并放入专用的类中。

必须在子类中调用父类(super class)的构造函数,这保证了子类是父类(super class)的改进。

最后,为了降低层次结构中的类之间的耦合度,我建议您仅使用抽象类型的继承,例如abstract类或接口(interface)s.

关于父类(super class)中的java静态工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31135900/

相关文章:

javascript - 添加除访问器之外的函数的语法是什么?

java - 我的第一个 JavaFX 应用程序中的不安全操作

java - Netbeans IDE 项目窗口不可见

java - 如何从 rpgle 调用 java -jar

java - 如何让intellij知道带有其他文件扩展名的xml文件格式?

c++ - 在工厂内管理类实例的更好方法是什么?

java - Spring 启动1.5.10 : implementing implicit grant

c# - 如何在 C# 中创建具有静态工厂方法的基类?

model-view-controller - 什么时候使用工厂模式?

php - Laravel 5.6 分贝 :seed throws FatalThrowableError : Class 'APP\Todo' not found