当前位置: 首页 > news >正文

设计模式之工厂模式的优缺点

工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。以下是工厂模式的优缺点:
 
优点
 
- 解耦对象的创建和使用:使得代码的依赖关系更加清晰,使用者不需要了解对象的具体创建过程,只需要关心如何使用对象,降低了代码的耦合度。
 
- 提高可维护性和可扩展性:当需要创建新的对象或者修改对象的创建逻辑时,只需要在工厂类中进行修改,而不需要在所有使用该对象的地方进行修改,便于代码的维护和扩展。
 
- 便于代码复用:工厂类可以被多个地方复用,提高了代码的复用性。
 
缺点
 
- 增加了代码复杂度:引入了工厂类,使得代码结构变得更加复杂,对于简单的对象创建场景,可能会显得过于繁琐。
 
- 不符合开闭原则:当需要增加新的产品对象时,虽然可以在不修改已有代码的情况下进行扩展,但是需要修改工厂类的创建逻辑,违反了开闭原则的“对修改关闭”原则。
 
- 工厂类可能会过于庞大:随着产品对象的不断增加,工厂类中的创建逻辑可能会变得非常复杂,导致工厂类难以维护。

以下是一个使用C++实现的工厂模式的简单代码示例,以创建不同类型的动物(猫和狗)为例:
 
cpp   
#include <iostream>
#include <string>
using namespace std;

// 动物基类
class Animal {
public:
    virtual void speak() = 0;
    virtual ~Animal() {}
};

// 猫类,继承自动物基类
class Cat : public Animal {
public:
    void speak() override {
        cout << "喵~喵~" << endl;
    }
};

// 狗类,继承自动物基类
class Dog : public Animal {
public:
    void speak() override {
        cout << "汪~汪~" << endl;
    }
};

// 动物工厂类
class AnimalFactory {
public:
    static Animal* createAnimal(const string& animalType) {
        if (animalType == "cat") {
            return new Cat();
        } else if (animalType == "dog") {
            return new Dog();
        }
        return nullptr;
    }
};

int main() {
    Animal* cat = AnimalFactory::createAnimal("cat");
    if (cat) {
        cat->speak();
        delete cat;
    }

    Animal* dog = AnimalFactory::createAnimal("dog");
    if (dog) {
        dog->speak();
        delete dog;
    }

    return 0;
}
 
 
在上述代码中:
 
1. 首先定义了抽象的  Animal  基类,其中包含一个纯虚函数  speak ,用于表示动物发出声音的行为。
 
2. 然后创建了具体的  Cat  类和  Dog  类,它们都继承自  Animal  基类,并实现了  speak  函数。
 
3.  AnimalFactory  是工厂类,它有一个静态函数  createAnimal ,根据传入的字符串参数("cat" 或 "dog")来创建相应的动物对象。
 
4. 在  main  函数中,通过调用  AnimalFactory  的  createAnimal  函数来获取动物对象,并调用其  speak  函数,最后记得释放动态分配的内存。

相关文章:

  • NLP 与常见的nlp应用
  • AI在工业自动化中的应用与挑战
  • 麦科信新品发布,8MHz,300Arms高频交直流电流探头CP3008
  • Linux驱动开发实战之SRIO驱动(二)基于Tsi721驱动
  • 分布式中间件:RabbitMQ确认消费机制
  • QT网页显示的几种方法及对比
  • 计算机网络精讲day1——计算机网络的性能指标(上)
  • 【大坐标处理】
  • MyBatis plus详解
  • 使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug
  • day-110 下降路径最小和 II
  • filebeat和logstash区别
  • reCAPTCHA 打码平台
  • CCBCISCN复盘
  • Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx
  • MacOS下的IntelliJ IDEA突然无法访问本机的虚拟机
  • Ubuntu上查看GPU使用情况并释放内存
  • 【C++】C++类
  • Java集合操作三剑客:Collection、collect与Collectors的协奏曲
  • 【高德】-下载路径规划数据-无代码
  • 水利部:山西、陕西等地旱情将持续
  • 98岁动物学家、北京大学教授杨安峰逝世
  • 印对巴军事打击后,巴外交部召见印度驻巴临时代办
  • 4月外汇储备增加410亿美元,黄金储备连续6个月增加
  • 上海国际电影节特设“走进大卫·林奇的梦境”单元
  • 创历史同期新高!“五一”假期全国快递揽投超48亿件