我是OOP和学习设计模式的新手,所以我写了一些简单的代码来尝试一个Factory方法,除了当我想添加另一个子类型时,一切似乎都很好。这里是到目前为止的代码:在java中扩展参数化工厂方法
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
类中,这肯定会打破开闭原则?或者,正如“四人帮”设计模式书中所建议的,重写参数化工厂方法来选择性地扩展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
,Child
,Adult
或Pensioner
的任何对象是合适的,新类别PersonFactoryWithInfant
将不得不延长PersonFactoryWithPensioner
。这不可能是正确的,似乎更可能是我误解了GoF的建议。
我的问题是:有没有办法添加一个新的子类型,可以返回到旧客户端而不改变它们,并且不需要通过更改PersonFactory
代码来包含新子类型来打破OCP?
道歉,如果我没有正确发布,这是我第一次在这里发布一个问题。我已经通过以前的答案看过类似的问题,但他们似乎没有解决这个问题。
您是否阅读过这篇文章:http://softwareengineering.stackexchange.com/questions/302780/does-the-factory-pattern-violate-the-open-closed-principle – jaudo
这不是工厂方法模式。这个例子通常被称为简单工厂。这不是一个GoF模式。 – jaco0646