1.简单工厂模式(Simple Factory Pattern),又叫做静态工厂方法(Static FactoryMethod Pattern)。
1.1 基本介绍
被创建的对象称为“产品”,创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式不在 GoF 23 种设计模式之列。
2.结构
2.1 角色
简单工厂(SimpleFactory):
是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的-建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Product):
是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
具体产品(ConcreteProduct):
是简单工厂模式的创建目标。
2.2 类图
3.优缺点
优点:
- 结构简单,调用方便。工厂和产品的职责区分明确。
- 客户端无需知道所创建具体产品的类名,只需知道参数即可。
缺点:
- 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
4.示例
#include <iostream>
#include <string>
// 产品接口
class Animal {
public:
virtual void makeSound() = 0; // 纯虚函数,让 Animal 成为一个抽象类
virtual ~Animal() {} // 虚析构函数,确保派生类能够正确析构
};
// 具体产品
class Dog : public Animal {
public:
void makeSound() override {
std::cout << "Woof!" << std::endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
std::cout << "Meow!" << std::endl;
}
};
// 工厂类
class AnimalFactory {
public:
static Animal* createAnimal(const std::string& type) {
if (type == "dog") {
return new Dog();
} else if (type == "cat") {
return new Cat();
} else {
return nullptr;
}
}
};
int main() {
Animal* animal = nullptr;
// 根据用户输入或条件来创建不同的动物对象
std::string type;
std::cout << "Enter the type of animal ('dog' or 'cat'): ";
std::cin >> type;
animal = AnimalFactory::createAnimal(type);
if (animal) {
animal->makeSound();
delete animal; // 使用完对象后,记得释放内存
} else {
std::cout << "Invalid animal type." << std::endl;
}
return 0;
}
Animal
是一个产品接口,声明了所有动物必须实现的makeSound
方法。Dog
和Cat
是具体产品,它们继承自Animal
并实现了makeSound
方法。AnimalFactory
是工厂类,包含一个createAnimal
静态方法,根据传入的字符串参数来决定创建哪种动物对象。- 在
main
函数中,我们根据用户输入来请求创建特定类型的动物对象,并使用该对象。
请注意,简单工厂模式可能会因为工厂类中的 createAnimal
方法越来越长而导致难以维护,特别是当产品种类增加时。在这种情况下,可以考虑使用工厂方法模式(Factory Method Pattern)或抽象工厂模式(Abstract Factory Pattern)来解决这个问题。