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

来源:互联网 发布:蜂窝移动数据用量为0 编辑:程序博客网 时间:2024/05/17 22:05

说下对抽象工厂模式的理解:
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口, 而无需指定他们具体的类。
在抽象工厂的内部包含了所有产品创建的抽象方法, 也就是说, 每个工厂都会生产所有提供的产品,因而, 不同的产品有不同工厂所生产的不同规格
他的优点是:
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;}
0 0
原创粉丝点击