抽象工厂模式(大话设计模式)C/C++版本

抽象工厂模式

在这里插入图片描述

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15927110.html

#include <iostream>
using namespace std;

// 抽象产品Department ,定义具体产品的公共接口
class Department
{
public:
    virtual ~Department() = default;
    virtual void Insert() = 0;
    virtual Department *GetDepartment() = 0;
};

// 创建具体产品类SqlserDepartment, 定义生产的具体产品;
class SqlserDepartment : public Department
{
public:
    void Insert() override
    {
        cout << "在SQL Server 中给 Department 表增加一条记录!" << endl;
    }
    Department *GetDepartment() override
    {
        cout << "在SQL Server 中根据ID 得到 Department 表一条记录!" << endl;
        return nullptr;
    }
};

// 创建具体产品类AccessDepartment, 定义生产的具体产品;
class AccessDepartment : public Department
{
public:
    void Insert() override
    {
        cout << "在 Access 中给 Department 表增加一条记录!" << endl;
    }
    Department *GetDepartment() override
    {
        cout << "在 Access 中根据ID 得到 Department 表一条记录!" << endl;
        return nullptr;
    }
};

// 抽象产品User ,定义具体产品的公共接口
class User
{
public:
    virtual ~User() = default;
    virtual void Insert() = 0;
    virtual User *GetUser() = 0;
};

// 创建具体产品类SqlserverUser, 定义生产的具体产品;
class SqlserverUser : public User
{
public:
    void Insert() override
    {
        cout << "在SQL Server 中给 User表增加一条记录!" << endl;
    }
    User *GetUser() override
    {
        cout << "在SQL Server 中根据ID 得到 User表一条记录!" << endl;
        return nullptr;
    }
};

// 创建具体产品类AccessUser, 定义生产的具体产品;
class AccessUser : public User
{
public:
    void Insert() override
    {
        cout << "在 Access 中给 User表增加一条记录!" << endl;
    }
    User *GetUser() override
    {
        cout << "在 Access 中根据ID 得到 User表一条记录!" << endl;
        return nullptr;
    }
};

// 抽象工厂,定义具体工厂的公共接口
class AbstractFactory
{
public:
    virtual ~AbstractFactory() = default;
    virtual User *CreateUser() = 0;
    virtual Department *CreateDepartment() = 0;
};

// 创建具体工厂SqlServerFactory,定义创建对应具体产品实例的方法;
class SqlServerFactory : public AbstractFactory
{
public:
    User *CreateUser() override
    {
        return new SqlserverUser(); // 该工厂 生产的产品
    }
    Department *CreateDepartment() override
    {
        return new SqlserDepartment;
    }
};

// 创建具体工厂AccessFactory,定义创建对应具体产品实例的方法;
class AccessFactory : public AbstractFactory
{
public:
    User *CreateUser() override
    {
        return new AccessUser(); // 该工厂 生产的产品
    }
    Department *CreateDepartment() override
    {
        return new AccessDepartment;
    }
};

int main()
{
    // AbstractFactory *factory = new SqlServerFactory;
    AbstractFactory *factory = new AccessFactory;

    // 调用的是 AccessFactory 工厂,准备生产  SqlserverUser 产品
    User *iu = factory->CreateUser();
    iu->Insert();
    iu->GetUser();

    // 调用的是 AccessFactory 工厂,准备生产  AccessDepartment 产品
    Department *id = factory->CreateDepartment();
    id->Insert();
    id->GetDepartment();

    delete factory;
    delete iu;
    delete id;
    factory = nullptr;
    id = nullptr;
    id = nullptr;
    return 0;
}

C

#include <stdio.h>
#include <stdlib.h>

// 抽象产品Department
typedef struct Department
{
    void (*Insert)(void *);
    struct Department *(*GetDepartment)(void *);
} Department;

// 抽象产品User
typedef struct User
{
    void (*Insert)(void *);
    struct User *(*GetUser)(void *);
} User;

// 抽象工厂
typedef struct AbstractFactory
{
    User *(*CreateUser)(void);
    Department *(*CreateDepartment)(void);
} AbstractFactory;

// 具体产品SqlserDepartment
typedef struct SqlserDepartment
{
    Department base;
} SqlserDepartment;

void SqlserDepartment_Insert(void *dept)
{
    printf("在SQL Server 中给 Department 表增加一条记录!\n");
}

Department *SqlserDepartment_GetDepartment(void *dept)
{
    printf("在SQL Server 中根据ID 得到 Department 表一条记录!\n");
    return NULL;
}

// 具体产品AccessDepartment
typedef struct AccessDepartment
{
    Department base;
} AccessDepartment;

void AccessDepartment_Insert(void *dept)
{
    printf("在 Access 中给 Department 表增加一条记录!\n");
}

Department *AccessDepartment_GetDepartment(void *dept)
{
    printf("在 Access 中根据ID 得到 Department 表一条记录!\n");
    return NULL;
}

// 具体产品SqlserverUser
typedef struct SqlserverUser
{
    User base;
} SqlserverUser;

void SqlserverUser_Insert(void *user)
{
    printf("在SQL Server 中给 User表增加一条记录!\n");
}

User *SqlserverUser_GetUser(void *user)
{
    printf("在SQL Server 中根据ID 得到 User表一条记录!\n");
    return NULL;
}

// 具体产品AccessUser
typedef struct AccessUser
{
    User base;
} AccessUser;

void AccessUser_Insert(void *user)
{
    printf("在 Access 中给 User表增加一条记录!\n");
}

User *AccessUser_GetUser(void *user)
{
    printf("在 Access 中根据ID 得到 User表一条记录!\n");
    return NULL;
}

// 具体工厂SqlServerFactory
typedef struct SqlServerFactory
{
    AbstractFactory base;
} SqlServerFactory;

User *SqlServerFactory_CreateUser(void *unused)
{
    SqlserverUser *user = (SqlserverUser *)malloc(sizeof(SqlserverUser));
    user->base.Insert = SqlserverUser_Insert;
    user->base.GetUser = SqlserverUser_GetUser;
    return (User *)user;
}

Department *SqlServerFactory_CreateDepartment(void *unused)
{
    SqlserDepartment *dept = (SqlserDepartment *)malloc(sizeof(SqlserDepartment));
    dept->base.Insert = SqlserDepartment_Insert;
    dept->base.GetDepartment = SqlserDepartment_GetDepartment;
    return (Department *)dept;
}

// 具体工厂AccessFactory
typedef struct AccessFactory
{
    AbstractFactory base;
} AccessFactory;

User *AccessFactory_CreateUser()
{
    AccessUser *user = (AccessUser *)malloc(sizeof(AccessUser));
    user->base.Insert = AccessUser_Insert;
    user->base.GetUser = AccessUser_GetUser;
    return (User *)user;
}

Department *AccessFactory_CreateDepartment()
{
    AccessDepartment *dept = (AccessDepartment *)malloc(sizeof(AccessDepartment));
    dept->base.Insert = AccessDepartment_Insert;
    dept->base.GetDepartment = AccessDepartment_GetDepartment;
    return (Department *)dept;
}

int main()
{
    AbstractFactory *factory = (AbstractFactory *)malloc(sizeof(AccessFactory));
    ((AccessFactory *)factory)->base.CreateUser = AccessFactory_CreateUser;
    ((AccessFactory *)factory)->base.CreateDepartment = AccessFactory_CreateDepartment;

    User *iu = factory->CreateUser();
    iu->Insert(iu);
    iu->GetUser(iu);

    Department *id = factory->CreateDepartment();
    id->Insert(id);
    id->GetDepartment(id);

    free(factory);
    free(iu);
    free(id);

    return 0;
}

总结

在工厂方法模式的基础上,在对应的工厂类中新增了相关产品的创建函数。(其实并不是很方便!!)

扩展:
简单工厂模式似乎更简便点,但是switch部分实在是破坏了开闭原则,可以使用“反射”(即动态识别类型)

C++可以使用静态函数指针数组来实现
参考:https://blog.csdn.net/klarclm/article/details/7352101

相关推荐

  1. 设计模式 抽象工厂

    2024-06-15 18:44:01       51 阅读
  2. 设计模式抽象工厂

    2024-06-15 18:44:01       52 阅读
  3. 设计模式-抽象工厂模式

    2024-06-15 18:44:01       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-15 18:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-15 18:44:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-15 18:44:01       82 阅读
  4. Python语言-面向对象

    2024-06-15 18:44:01       91 阅读

热门阅读

  1. 使用 Python进行自动备份文件

    2024-06-15 18:44:01       34 阅读
  2. React <> </>的用法

    2024-06-15 18:44:01       32 阅读
  3. 《Vue3 基础知识》Pinia 02 之 项目中从 Vuex 转 Pinia

    2024-06-15 18:44:01       32 阅读
  4. 前端面试题——React篇

    2024-06-15 18:44:01       33 阅读
  5. 【Windchill高级查询感悟笔记】

    2024-06-15 18:44:01       23 阅读
  6. 【算法与数据结构】【数组篇】【题1-题5】

    2024-06-15 18:44:01       52 阅读
  7. Ubuntu 移除netplan

    2024-06-15 18:44:01       29 阅读
  8. ubuntu设置GPU功率

    2024-06-15 18:44:01       31 阅读
  9. MatLab中无穷量和非数值量

    2024-06-15 18:44:01       34 阅读
  10. 网络安全练气篇——常见服务端口对应漏洞

    2024-06-15 18:44:01       33 阅读
  11. postman接口测试工具详解

    2024-06-15 18:44:01       34 阅读