使用抽象工厂模式实现数据库替换管理 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
- 使用抽象工厂模式实现数据库替换管理 C++
- C语言实现抽象工厂模式实例
- 抽象工厂模式 (C语言实现)
- 使用Object-C实现23种设计模式之抽象工厂模式
- 设计模式的实现(C++)------抽象工厂模式(AbstractFactory)
- 抽象工厂模式:实现ASP.NET访问不同数据库
- 抽象工厂模式:实现ASP.NET访问不同数据库
- 【C++】Chapter11:抽象工厂模式
- Objective C--抽象工厂模式
- Objective C 抽象工厂模式
- 抽象工厂模式(C#)
- Objective C--抽象工厂模式
- C#抽象工厂模式实现
- C# 实现抽象工厂模式
- php实现抽象工厂模式
- C++实现抽象工厂模式
- 抽象工厂模式 (C++实现)
- 抽象工厂模式lua实现
- centos7.2 挂载NTFS移动硬盘
- 数据结构学习笔记
- Hadoop与Spark常用配置参数总结
- android activity 的启动模式
- 大整数模板
- 使用抽象工厂模式实现数据库替换管理 C++
- Python学习笔记
- Android 坐标系统详解
- MYSQL to_days(date)用法
- 最小生成树之MST性质
- 百练2973:Skew数
- (未完成)Zookeeper学习(七):Master的选举
- iOS runtime
- LeetCodeOJ:2. Add Two Numbers