1. 工厂方法模式定义与目的
工厂方法模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而无需指定具体的类。这种模式让子类决定实例化哪一个产品类,使得代码更具灵活性和扩展性,也符合“开放封闭原则”。
2. 工厂方法模式要素
- 抽象工厂类(Abstract Factory):声明一个创建产品的接口,但不涉及具体的产品类。
- 具体工厂类(Concrete Factory):继承抽象工厂类,实现创建具体产品的接口。
- 抽象产品类(Abstract Product):定义产品的接口,所有具体产品类都必须实现这个接口。
- 具体产品类(Concrete Product):继承抽象产品类,实现具体的产品功能。
3. C++ 中工厂方法模式的实现范例
3.1 定义抽象工厂接口
class AbstractFactory {
public:
virtual ~AbstractFactory() {}
virtual Animal* createAnimal() const = 0;
};
class Animal {
public:
virtual ~Animal() {}
virtual void makeSound() const = 0;
};
3.2 定义具体工厂类
class DogFactory : public AbstractFactory {
public:
Animal* createAnimal() const override {
return new Dog();
}
};
class CatFactory : public AbstractFactory {
public:
Animal* createAnimal() const override {
return new Cat();
}
};
class Dog : public Animal {
public:
void makeSound() const override {
std::cout << "Woof!" << std::endl;
}
};
class Cat : public Animal {
public:
void makeSound() const override {
std::cout << "Meow!" << std::endl;
}
};
3.3 使用工厂方法创建产品
int main() {
AbstractFactory* dogFactory = new DogFactory();
Animal* myDog = dogFactory->createAnimal();
myDog->makeSound();
AbstractFactory* catFactory = new CatFactory();
Animal* myCat = catFactory->createAnimal();
myCat->makeSound();
delete myDog;
delete myCat;
delete dogFactory;
delete catFactory;
return 0;
}
4. 注意事项
- 面向接口编程:工厂方法模式强调了针对抽象编程的重要性,客户代码只需关心抽象工厂接口,无需知道具体产品类型。
- 扩展性:当需要新增产品类型时,只需要增加新的具体产品类和相应的具体工厂类即可,原有代码无需修改,体现了“开闭原则”。
- 资源管理:在实际应用中,建议使用智能指针(如C++11中的std::unique_ptr)来自动管理对象的生命周期,避免手动释放资源带来的错误风险。
通过工厂方法模式,可以根据不同的需求动态创建不同类型的产品对象,使得程序更加灵活且易于维护。