创建型模式
- 工厂方法模式(Factory Method Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
- 单例模式(Singleton Pattern)
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,旨在通过定义一个接口来创建对象,而将对象的具体实例化推迟到子类中。也就是说,工厂方法模式允许客户端通过工厂方法来创建对象,但具体的创建过程由具体的子类来实现。
关键概念:
- 产品接口(Product):定义工厂方法所创建对象的类型。
- 具体产品(Concrete Product):实现了产品接口的具体类。
- 抽象工厂(Creator):定义一个用于创建产品对象的工厂方法,并且通常会提供一个默认实现。
- 具体工厂(Concrete Creator):实现了抽象工厂中的工厂方法,返回一个具体的产品。
工厂方法模式的优点:
- 扩展性:增加新的产品时,客户端代码无需修改,只需添加新的具体工厂类。
- 解耦:客户端不需要知道具体产品的创建过程,只需要依赖工厂方法接口。
- 提高灵活性:允许通过多态来定制工厂行为。
示例:动物工厂
假设我们要创建一个工厂来生产不同类型的动物,基于工厂方法模式,我们会将创建动物的过程抽象化,并通过不同的子类来提供具体的实现。
1. 定义产品接口
我们先定义一个动物的接口,每种动物都必须实现这个接口。
// 产品接口:Animal
public interface Animal {
void speak();
}
2. 定义具体产品
然后,我们创建不同种类的动物,分别实现 Animal
接口。
// 具体产品:Dog
public class Dog implements Animal {
@Override
public void speak() {
System.out.println("Woof! Woof!");
}
}
// 具体产品:Cat
public class Cat implements Animal {
@Override
public void speak() {
System.out.println("Meow! Meow!");
}
}
3. 定义抽象工厂
接下来,我们定义一个抽象的工厂类,提供工厂方法来创建动物。
// 抽象工厂:AnimalFactory
public abstract class AnimalFactory {
public abstract Animal createAnimal();
}
4. 定义具体工厂
然后,我们定义具体的工厂类,分别实现 AnimalFactory
并提供不同的动物对象。
// 具体工厂:DogFactory
public class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
// 具体工厂:CatFactory
public class CatFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
5. 客户端代码
在客户端代码中,我们不直接创建具体的动物,而是通过工厂来创建。
// 客户端代码
public class AnimalStore {
private AnimalFactory animalFactory;
public AnimalStore(AnimalFactory animalFactory) {
this.animalFactory = animalFactory;
}
public void orderAnimal() {
Animal animal = animalFactory.createAnimal();
animal.speak();
}
public static void main(String[] args) {
// 创建一个狗的工厂
AnimalFactory dogFactory = new DogFactory();
AnimalStore store1 = new AnimalStore(dogFactory);
store1.orderAnimal(); // 输出:Woof! Woof!
// 创建一个猫的工厂
AnimalFactory catFactory = new CatFactory();
AnimalStore store2 = new AnimalStore(catFactory);
store2.orderAnimal(); // 输出:Meow! Meow!
}
}
总结
工厂方法模式的关键在于将对象的创建过程委托给子类,而不是直接在客户端中进行对象创建。这样,工厂方法模式使得系统具有良好的扩展性:增加新的产品只需要增加新的具体工厂类,而无需修改现有的客户端代码或其他工厂类。这种模式非常适合用于需要创建一系列相关或相似对象的场景,而且可以保证系统中的对象创建过程遵循一致的方式。