使用抽象工厂模式实现数据库替换管理 C++

81 篇文章 0 订阅
29 篇文章 1 订阅

说下对抽象工厂模式的理解:
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口, 而无需指定他们具体的类。
在抽象工厂的内部包含了所有产品创建的抽象方法, 也就是说, 每个工厂都会生产所有提供的产品,因而, 不同的产品有不同工厂所生产的不同规格
他的优点是:
1. 可以方便的更换产品的系列, ie, 更换具体的工厂
2. 他让具体的创建实例过程和客户端分离, 客户通过他们的抽象接口实现对实例的操作, 产品的具体类名也被具体工厂分离实现, 不会出现在客户代码中。

但是他也有缺点: 在需要添加产品的时候, 需要改动具体的工厂, 违反了开闭原则

在C#中, 书中介绍了可以使用反射机制实现,借助简单工厂, 去除switch, if 的逻辑判断, 解决维护和扩展的 问题。

UML 图
这里写图片描述
程序执行效果图:
这里写图片描述
代码
factory.h

#ifndef _FACTORY_H_
#define _FACTORY_H_

#include "MainProduct.h"
#include <memory>

using std::shared_ptr;

/************************************************************************/
/* 工厂接口                                                             */
/************************************************************************/
class CIFactory{
public:
    virtual shared_ptr<CIUser> createUser() = 0;
    virtual shared_ptr<CIDepartment> createDepartment() = 0;
};

#endif // _FACTORY_H_

mainfactory.h

#ifndef _MAINFACTORY_H_
#define _MAINFACTORY_H_

#include "Factory.h"
#include "MainProduct.h"

/************************************************************************/
/* sql 工厂                                                             */
/************************************************************************/
class SqlFactory : public CIFactory{
public:
    shared_ptr<CIUser> createUser(){
        return shared_ptr<CIUser>(new SqlServerUser());
    }

    shared_ptr<CIDepartment> createDepartment(){
        return shared_ptr<CIDepartment>(new SqlServerDepartment());
    }
};

/************************************************************************/
/* access 工厂                                                          */
/************************************************************************/
class AccessFactory : public CIFactory{
public:
    shared_ptr<CIUser> createUser(){
        return shared_ptr<CIUser>(new AccessUser());
    }

    shared_ptr<CIDepartment> createDepartment(){
        return shared_ptr<CIDepartment>(new AccessDepartment());
    }
};

#endif // _MAINFACTORY_H_

product.h

#ifndef _PRODUCT_H_
#define _PRODUCT_H_

#include <string>

/************************************************************************/
/* user 数据结构                                                        */
/************************************************************************/
class User{
public:
    int Id() const { return _id; }
    void Id(int val) { _id = val; }
    std::string Name() const { return _name; }
    void Name(std::string val) { _name = val; }

private:
    int _id;    
    std::string _name;  
};

class CIUser{
public:
    virtual void Insert(User user) = 0;
    virtual User getUser(int id) const = 0;
};

/************************************************************************/
/* department 数据结构                                                        */
/************************************************************************/
class Department{
public:
    int Id() const { return _id; }
    void Id(int val) { _id = val; }
    std::string Name() const { return _name; }
    void Name(std::string val) { _name = val; }

private:
    int _id;
    std::string _name;
};

class CIDepartment{
public:
    virtual void Insert(Department department) = 0;
    virtual Department getDepartment(int id) const = 0;
};


#endif // _PRODUCT_H_

mainproduct.h

#ifndef _MAINPRODUCT_H_
#define _MAINPRODUCT_H_

#include "product.h"
#include <iostream>

using std::cout;
using std::endl;

/************************************************************************/
/* sql server user                                                      */
/************************************************************************/
class SqlServerUser : public CIUser{
public:
    void Insert(User user){
        cout << "sql server insert a record" << endl;
    }

    User getUser(int id) const{
        cout << "get user from sql server" << endl;
        return User();
    }
};

/************************************************************************/
/* Access user                                                      */
/************************************************************************/
class AccessUser : public CIUser{
public:
    void Insert(User user){
        cout << "access insert a record" << endl;
    }

    User getUser(int id) const{
        cout << "get user from access" << endl;
        return User();
    }
};

/************************************************************************/
/* sql server department                                                */
/************************************************************************/
class SqlServerDepartment : public CIDepartment{
public:
    void Insert(Department user){
        cout << "sql server insert a record" << endl;
    }

    Department getDepartment(int id) const{
        cout << "get Department from sql server" << endl;
        return Department();
    }
};

/************************************************************************/
/* Access department                                                    */
/************************************************************************/
class AccessDepartment : public CIDepartment{
public:
    void Insert(Department user){
        cout << "access insert a record" << endl;
    }

    Department getDepartment(int id) const{
        cout << "get Department from access" << endl;
        return Department();
    }
};

#endif // _MAINPRODUCT_H_

main.cpp

#include "MainFactory.h"
#include "MainProduct.h"
#include <iostream>
#include <memory>

using namespace std;

int main(){
    shared_ptr<User> user(new User);
    shared_ptr<CIFactory> factory(new SqlFactory);
    shared_ptr<CIUser> iuser = factory->createUser();

    iuser->Insert(*user);
    iuser->getUser(1);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值