我是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的建议.Child
Adult
Pensioner
PersonFactoryWithInfant
PersonFactoryWithPensioner
我的问题是:有没有办法添加一个新的子类型,可以返回到旧客户端而不更改它们,并且通过更改PersonFactory
代码以包含新的子类型而不破坏OCP ?
抱歉,如果我没有正确发布,这是我第一次在这里发帖提问.我已经查看了类似问题的先前答案,但他们似乎没有完全解决这个问题.