And*_*ipp 9 java factory-method open-closed-principle solid-principles
我是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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果要求后来更改为包括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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在这意味着现在所有调用PersonFactory现在的客户端都必须改为使用PersonFactoryWithPensioner,或者我必须接受新客户端可以调用PersonFactoryWithPensioner旧客户端,例如.当年龄> 70时,它ClientA仍然只会收到一个Adult物体.如果后来在另一个子类上,它会变得更糟.Infant被添加.为了确保新客户接收新的类,或者适当的对象Infant,必须扩展新的类.这不可能是正确的,似乎我更有可能误解了GoF的建议.ChildAdultPensionerPersonFactoryWithInfantPersonFactoryWithPensioner
我的问题是:有没有办法添加一个新的子类型,可以返回到旧客户端而不更改它们,并且通过更改PersonFactory代码以包含新的子类型而不破坏OCP ?
抱歉,如果我没有正确发布,这是我第一次在这里发帖提问.我已经查看了类似问题的先前答案,但他们似乎没有完全解决这个问题.
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |