创建型模式(Creational Patterns)之工厂模式(Factory Pattern)之简单工厂模式(Simple Factory Pattern)

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 方法。
  • DogCat 是具体产品,它们继承自 Animal 并实现了 makeSound 方法。
  • AnimalFactory 是工厂类,包含一个 createAnimal 静态方法,根据传入的字符串参数来决定创建哪种动物对象。
  • main 函数中,我们根据用户输入来请求创建特定类型的动物对象,并使用该对象。

        请注意,简单工厂模式可能会因为工厂类中的 createAnimal 方法越来越长而导致难以维护,特别是当产品种类增加时。在这种情况下,可以考虑使用工厂方法模式(Factory Method Pattern)或抽象工厂模式(Abstract Factory Pattern)来解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的小七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值