我正在阅读Head First Design Patterns,我有一个问题。在本书的开头,我看到了这个原则:
赞成'对象组合'而不是'类继承
然后我看到了Factory Method with
abstract class Creator{
abstract Product create(String type);
}
和继承
class ConcreteCreator extends Creator{
Product create(String type){
//creation
}
}
但我们可以用Simple Factory编写我们的类,比如
class OurClass{
SimpleFactory factory;
void ourMethod(){
Product product = factory.create(String type);
}
void setFactory(SimpleFactory factory){
this.factory = factory;
}
interface SimpleFactory {
Product create(String type);
}
class AnotherConcreteCreator implements SimpleFactory {
Product create(String type){
//creation
}
}
从第二种方法我们给出松耦合和可互换。但工厂方法存在 - 所以有人需要它。工厂方法的优点是什么?
答案 0 :(得分:4)
首先,区分factory method pattern和abstract factory pattern非常重要,为此,请参阅Differences between Abstract Factory Pattern and Factory Method和Why there are two separate patterns:Abstract Factory and Factory Method以及What is the basic difference between the Factory and Abstract Factory Patterns? 。正如你所看到的,这有点棘手,因此我在下面所说的必须采取一些盐。
特别是,您的OurClass
示例作为抽象工厂模式的典型用例发生在我身上。更具体地说,抽象工厂模式使您可以灵活地使创建的对象的具体类型成为类的参数,并且它的典型用例可以是dependency injection(即使这通常是在更加自动化的情况下完成的)方式),另见Dependency Injection vs Factory Pattern。
粗略地说,在抽象工厂模式中,您将对象的构造委托给外部类(通常,此类不仅要创建一个而是创建多个相关对象),而在工厂方法模式中,您委派构造对象的子类。您还可以认为抽象工厂模式将工厂方法模式用于其创建方法。
因此,关于何时使用工厂方法模式的问题的一个简单答案如下:当对象的创建是子类的责任时。这意味着,当只有子类应该或者可以决定需要创建什么对象时,这是子类行为的一个方面,这会让我们回到最初的假设,并归结为问题:什么时候应该我分别使用继承?Prefer composition over inheritance?。
另一方面,抽象工厂模式可以在您描述的情况下使用,当外部因素决定需要创建哪些对象并且需要这种灵活性时,从而证明代码所需的额外复杂性。