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