简单工厂VS工厂方法(为什么要使用工厂方法)



我试图学习模式并进入工厂,我理解简单工厂和工厂方法的概念,我知道它们是如何工作的,我不能理解的是工厂方法比简单工厂有什么好处。示例:

//We have our clients here
public class Animal {}
public class Dog extends Animal{}
public class Cat extends Animal{}

在一个简单的工厂里,我们会有这样的东西:

public Animal getAnimal(String type) {
switch (type) {
case "cat": 
return new Cat;
case "dog":
return new Dog;
}
return null;
}

现在我们采用工厂方法:

public abstract class AnimalFactory {
public Animal createAnimal() {
Animal animal = getAnimal();
animal.pet();
return animal;
}

protected abstract Animal getAnimal();
}
public class DogFactory extends AnimalFactory{
public Animal getAnimal(){
//some logic
return new Dog;
}
}
public class CatFactory extends AnimalFactory{
public Animal getAnimal(){
//some logic
return new Cat;
}
}

有趣的是,对于工厂方法,我们需要使用多态性,但我们仍然需要实例化,这取决于我们需要什么类型,所以我想我们会有这样的东西:

public Animal getAnimal(String type) {
AnimalFactory animalFactory;
switch (type) {
case "cat": 
animalFactory = new CatFactory();  //polymorphism     
return animalFactory.getAnimal();
case "dog":
animalFactory = new DogFactory();  //polymorphism     
return animalFactory.getAnimal();
}
return null;
}

据我所知,设计模式背后的主要思想是使代码更可重用,更易于扩展,所以想象一下我们需要添加一种新的动物,比如鹦鹉。在这两种情况下,我们都创建了扩展Animal类的Parrot类,并且在这两个情况下;Parrot";对于简单的工厂,我们将直接实例化新的Parrot,对于工厂方法,我们将实例化ParrotFactory。我的问题是区别是什么,为什么我们需要工厂方法模式?

我能看到的唯一好处是,在工厂方法中,你可以为将扩展它的工厂定义通用逻辑(是吗?(

GoF工厂方法模式与大多数其他工厂模式的关键区别在于客户端的身份。在大多数工厂模式中,客户端是工厂的调用者

class Client {
Product p = someFactoryObject.method();
}

但在工厂方法模式中,客户端(具体(工厂。

class Client extends Factory {
@Override
Product factoryMethod() {
return new ConcreteProduct();
}
}

要想知道为什么这种工厂子类化关系有意义,最简单的方法是将父Factory想象成框架的一部分。该框架必须与任何Product实现兼容,并且它希望每个客户端定义自己的具体产品。在编写框架时,这些具体的产品可能还不存在。

Client将自己插入框架(通过继承(时,它定义了一个ConcreteProduct供框架使用。与之前的答案相反,这与封装创造复杂性无关。事实上,工厂方法的实现是一行代码。

目的是,

工厂方法允许类将实例化推迟到子类。(第107页(

延迟是关键。工厂方法允许您在未知产品方面实现API。继承就是它用来实现这一点的工具。Simple Factory(后来(在Head First Design上发布,作为教学辅助,并不是真正用于生产代码。

混淆源于工厂方法必须参数化的假设。这一假设得出的结论是,工厂的目的是允许客户端在运行时在多个产品实现中进行选择。请注意,此处的factoryMethod()不包含任何参数。

要理解工厂方法模式,请考虑只有一个具体产品的场景,在定义工厂方法API时,它根本不存在,并且不归API作者所有。

好处是它封装了创建狗的逻辑。任何关于狗的创造的修改都只发生在DogFactory(单一责任(上。当你要对对象进行任何设置时,这是一个很好的选择,就像在你返回狗对象之前有任何代码一样。如果你在简单的工厂里做,它会被搞砸,并使方法变得更长。但在你的例子中,它只是做一个简单的new Dog()new Cat(),我更喜欢简单的工厂。IMHO

Factory方法的好处通常是包含复杂类(或所需的类层次结构设置(的逻辑,您不想混淆代码,或者如果频繁使用,也不想从头开始创建。汽车发动机。因此,您可以将混乱的代码提取到Factory中,使类层次结构更易于访问/更可重用,并通过隐藏复杂的细节使代码的其余部分更具可读性。

最新更新