所有三种工厂类型都做同样的事情:它们是“智能构造函数”。
假设您希望能够创建两种水果:苹果和橙子。
厂
工厂是“固定的”,因为你只有一个没有子类化的实现。在本例中,您将有一个如下类:
class FruitFactory {
public Apple makeApple() {
// Code for creating an Apple here.
}
public Orange makeOrange() {
// Code for creating an orange here.
}
}
用例:构造 Apple 或 Orange 有点太复杂了,无法在构造函数中处理。
工厂方法
工厂方法通常在类中有一些泛型处理,但希望改变实际使用的水果类型时使用。所以:
abstract class FruitPicker {
protected abstract Fruit makeFruit();
public void pickFruit() {
private final Fruit f = makeFruit(); // The fruit we will work on..
<bla bla bla>
}
}
...然后,您可以通过在子类中实现工厂方法来重用 中的常见功能:FruitPicker.pickFruit()
class OrangePicker extends FruitPicker {
@Override
protected Fruit makeFruit() {
return new Orange();
}
}
抽象工厂
抽象工厂通常用于依赖注入/策略之类的事情,当你希望能够创建一整个需要“同类”的对象家族,并具有一些共同的基类时。这是一个模糊的与水果有关的例子。这里的用例是,我们希望确保我们不会意外地在Apple上使用OrangePicker。只要我们从同一家工厂获得水果和采摘器,它们就会匹配。
interface PlantFactory {
Plant makePlant();
Picker makePicker();
}
public class AppleFactory implements PlantFactory {
Plant makePlant() {
return new Apple();
}
Picker makePicker() {
return new ApplePicker();
}
}
public class OrangeFactory implements PlantFactory {
Plant makePlant() {
return new Orange();
}
Picker makePicker() {
return new OrangePicker();
}
}