【设计模式】简单工厂模式

C语言实现简单的工厂模式

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 图形类型枚举
typedef enum {
    CIRCLE,
    SQUARE,
    RECTANGLE
} ShapeType;

// 图形结构体
typedef struct {
    ShapeType type;
    float area;
} Shape;

// 创建圆形
Shape* createCircle() {
    Shape* circle = (Shape*)malloc(sizeof(Shape));
    circle->type = CIRCLE;
    circle->area = 0.0;
    return circle;
}

// 创建正方形
Shape* createSquare() {
    Shape* square = (Shape*)malloc(sizeof(Shape));
    square->type = SQUARE;
    square->area = 0.0;
    return square;
}

// 创建长方形
Shape* createRectangle() {
    Shape* rectangle = (Shape*)malloc(sizeof(Shape));
    rectangle->type = RECTANGLE;
    rectangle->area = 0.0;
    return rectangle;
}

// 工厂方法根据类型创建图形
Shape* createShape(ShapeType type) {
    switch (type) {
        case CIRCLE:
            return createCircle();
        case SQUARE:
            return createSquare();
        case RECTANGLE:
            return createRectangle();
        default:
            return NULL;
    }
}

int main() {
    Shape* circle = createShape(CIRCLE);
    Shape* square = createShape(SQUARE);
    Shape* rectangle = createShape(RECTANGLE);

    // 假设这里对图形对象进行了一些操作

    // 释放内存
    free(circle);
    free(square);
    free(rectangle);

    return 0;
}

C++实现简单的工厂模式

cpp 复制代码
#include <iostream>

// 图形类型枚举
enum class ShapeType {
    CIRCLE,
    SQUARE,
    RECTANGLE
};

// 图形基类
class Shape {
public:
    virtual ~Shape() {}
    virtual float getArea() = 0;
};

// 圆形类
class Circle : public Shape {
public:
    Circle() {
        std::cout << "Creating Circle..." << std::endl;
    }

    float getArea() override {
        std::cout << "Calculating Circle Area..." << std::endl;
        // 计算圆形面积的具体实现
        return 0.0;
    }
};

// 正方形类
class Square : public Shape {
public:
    Square() {
        std::cout << "Creating Square..." << std::endl;
    }

    float getArea() override {
        std::cout << "Calculating Square Area..." << std::endl;
        // 计算正方形面积的具体实现
        return 0.0;
    }
};

// 长方形类
class Rectangle : public Shape {
public:
    Rectangle() {
        std::cout << "Creating Rectangle..." << std::endl;
    }

    float getArea() override {
        std::cout << "Calculating Rectangle Area..." << std::endl;
        // 计算长方形面积的具体实现
        return 0.0;
    }
};

// 图形工厂类
class ShapeFactory {
public:
    static Shape* createShape(ShapeType type) {
        switch (type) {
            case ShapeType::CIRCLE:
                return new Circle();
            case ShapeType::SQUARE:
                return new Square();
            case ShapeType::RECTANGLE:
                return new Rectangle();
            default:
                std::cout << "Invalid Shape Type!" << std::endl;
                return nullptr;
        }
    }
};

int main() {
    Shape* circle = ShapeFactory::createShape(ShapeType::CIRCLE);
    Shape* square = ShapeFactory::createShape(ShapeType::SQUARE);
    Shape* rectangle = ShapeFactory::createShape(ShapeType::RECTANGLE);

    // 假设这里对图形对象进行了一些操作

    // 删除对象,避免内存泄漏
    delete circle;
    delete square;
    delete rectangle;

    return 0;
}

工厂模式的优缺点:

优点:

封装对象的创建 :工厂模式将对象的创建过程封装在工厂类中,客户端代码无需直接调用构造函数来创建对象,从而降低了代码耦合度。
易于扩展 :如果需要添加新类型的产品(图形),只需要添加一个新的产品类和对应的工厂方法即可,不需要修改现有代码,符合开闭原则。
屏蔽具体实现 :客户端只需与抽象产品和抽象工厂进行交互,不关心具体的产品类和工厂类,隐藏了产品对象的具体实现。
创建对象的集中管理 :所有产品的创建都在工厂类中,便于统一管理和维护。
容易调试:通过在工厂方法中添加打印语句,可以方便地观察对象的创建过程和其他信息,便于调试。

缺点:

增加了类的个数 :每个具体产品都需要一个对应的具体工厂类,如果产品较多,会增加类的数量,增加系统复杂性。
增加了系统抽象性 :引入工厂类和抽象产品,增加了系统的抽象性和理解难度,增加开发难度。
不易理解 :工厂模式的代码会比直接创建对象的方式复杂,理解起来可能会有一定困难。
可能造成额外开销:在运行时使用工厂方法创建对象可能会比直接使用构造函数创建对象稍微慢一些,因为需要进行动态内存分配。但在实际应用中,这个开销通常是可以忽略不计的。

综上所述,工厂模式是一种灵活且可扩展的设计模式,它通过封装对象的创建过程,帮助我们降低代码的耦合度,并支持系统的扩展和维护。工厂模式适用于需要在运行时动态创建对象的场景,例如创建不同类型的图形、产品、对象等。通过工厂模式,我们可以更加灵活地管理对象的创建,使代码结构更加清晰和易于维护。

然而,工厂模式也有一些局限性,例如增加了类的数量和抽象性,可能会增加代码的复杂性和理解难度。在使用工厂模式时,需要根据实际情况来选择合适的设计方案,避免过度设计。对于简单的应用场景,直接使用构造函数创建对象可能更为简单和直观。

总的来说,工厂模式是一种有用的设计模式,它在合适的场景下可以为我们提供更好的设计和代码组织结构。对于复杂的系统,特别是涉及到大量对象创建和管理的情况,工厂模式可以发挥更大的优势。在实际项目中,根据具体需求和复杂度选择是否使用工厂模式是很重要的。

相关推荐
Crossoads1 分钟前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
自身就是太阳9 分钟前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯
蔚一26 分钟前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则
孙小二写代码32 分钟前
[leetcode刷题]面试经典150题之1合并两个有序数组(简单)
算法·leetcode·面试
little redcap38 分钟前
第十九次CCF计算机软件能力认证-1246(过64%的代码-个人题解)
算法
David猪大卫1 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ1 小时前
数据结构(Day14)
linux·c语言·数据结构·算法
夏天天天天天天天#1 小时前
求Huffman树及其matlab程序详解
算法·matlab·图论
Infedium1 小时前
优数:助力更高效的边缘计算
算法·业界资讯
student.J1 小时前
傅里叶变换
python·算法·傅里叶