【发布时间】:2021-04-01 20:59:01
【问题描述】:
我正在尝试学习模式并进入工厂,我了解简单工厂和工厂方法的概念,我知道它们是如何工作的,但我无法理解工厂方法相对于简单工厂有什么好处。示例:
//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 类,在这两种情况下,我们都必须进入该 switch 语句并添加一个新案例“Parrot” 对于简单工厂,我们将直接实例化新 Parrot,对于工厂方法我们将实例化 ParrotFactory。 我的问题是有什么区别,为什么我们需要工厂方法模式?
我能看到的唯一好处是,在工厂方法中,您可以为将扩展它的工厂定义通用逻辑(是这样吗?)
【问题讨论】:
-
这里的“工厂方法”示例不是任何类型的工厂。请参阅我的答案区分Factory Method from Abstract Factory。该线程中的前几个答案都包含有关工厂模式的良好信息。
-
为什么我的例子不是工厂?工厂方法和工厂抽象之间的区别是另外一回事,我的问题是工厂方法比简单工厂有什么好处
-
对 AnimalFactory 抽象类进行了编辑,这是缺少的吗?
标签: java design-patterns