当前位置:  开发笔记 > 编程语言 > 正文

在java中扩展参数化工厂方法

如何解决《在java中扩展参数化工厂方法》经验,为你挑选了0个好方法。

我是OOP的新手并学习设计模式所以我写了一些简单的代码来试用一个Factory方法,一切看起来都不错,除非我想添加另一个子类型.这是迄今为止的代码:

public interface Person {
  public String getDescription();
}

public class Adult implements Person { 
  @Override
  public String getDescription() {
    return "I am an ADULT";
  }
}

public class Child implements Person {
  @Override
  public String getDescription() {
    return "I am a CHILD";
  }
}

public class PersonFactory {
  public Person create(int age) {
    if (age < 18) return new Child();
    return new Adult();
  }
}

public class ClientA {
  public static void main(String[] args) {
    PersonFactory personFactory = new PersonFactory();
    Person person;
    person = personFactory.create(80);
    System.out.println(person.getDescription());   
  }
}

如果要求后来更改为包括Pensioner年龄> 70 的子类,我将不得不:

将该行添加if (age > 70) return new Pensioner();到类中的create()方法中PersonFactory,这肯定会破坏开放原则?或者,正如The Gang Of Four Design Patterns一书中所建议的那样,覆盖参数化工厂方法以选择性地扩展Creator生成的产品.在这种情况下,我认为这意味着写一个新的类:

public class PersonFactoryWithPensioner extends PersonFactory { 
  @Override
  public Person create(int age) {
    if (age > 70) return new Pensioner();
    return super.create(age);
  }
}

现在这意味着现在所有调用PersonFactory现在的客户端都必须改为使用PersonFactoryWithPensioner,或者我必须接受新客户端可以调用PersonFactoryWithPensioner旧客户端,例如.当年龄> 70时,它ClientA仍然只会收到一个Adult物体.如果后来在另一个子类上,它会变得更糟.Infant被添加.为了确保新客户接收新的类,或者适当的对象Infant,必须扩展新的类.这不可能是正确的,似乎我更有可能误解了GoF的建议.ChildAdultPensionerPersonFactoryWithInfantPersonFactoryWithPensioner

我的问题是:有没有办法添加一个新的子类型,可以返回到旧客户端而不更改它们,并且通过更改PersonFactory代码以包含新的子类型而不破坏OCP ?

抱歉,如果我没有正确发布,这是我第一次在这里发帖提问.我已经查看了类似问题的先前答案,但他们似乎没有完全解决这个问题.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有