抽象工厂
前景提要:公司原来客户有个软件是使用SQL数据库的,现在另一个客户也需要相同功能软件,但是底层数据库使用Access。
针对这种情况,肯定是复用原来的软件功能,将数据库模块替换即可。
UML:
数据(用户):
#include <string>
class User
{
public:
std::string m_sName;
};
操控数据接口:
#include "User.h"
#include <iostream>
class InterfaceUser
{
public:
public:
virtual void Insert(const User& user) = 0;
virtual User* GetUserName(const int& id) = 0;
};
接口实现SQL:
class SQLUser:public InterfaceUser
{
public:
void Insert(const User& user) override
{
std::cout << "insert user to SQL." << std::endl;
};
User* GetUserName(const int& id) override
{
std::cout << "get user information form SQL by id." << std::endl;
return nullptr;
};
};
接口实现Access:
class AccessUser :public InterfaceUser
{
public:
void Insert(const User& user) override
{
std::cout << "insert user to Access." << std::endl;
};
User* GetUserName(const int& id) override
{
std::cout << "get user information form Access by id." << std::endl;
return nullptr;
};
};
抽象工厂接口:
#include "InterfaceUser.h"
#include <memory>
using namespace std;
class InterfaceFactory
{
public:
virtual unique_ptr<InterfaceUser> CreateUser() =0;
};
接口实现SQL:
class SQLFactory:public InterfaceFactory
{
public:
unique_ptr<InterfaceUser> CreateUser() override
{
unique_ptr<InterfaceUser> pt(new SQLUser());
return pt;
};
};
接口实现Access:
class AccessFactory: public InterfaceFactory
{
public:
unique_ptr<InterfaceUser> CreateUser() override
{
unique_ptr<InterfaceUser> pt(new AccessUser());
return pt;
};
};
客户端代码:
#include <iostream>
#include "InterfaceUser.h"
#include "InterfaceFactory.h"
int main()
{
unique_ptr<User> user (new User());
unique_ptr<InterfaceFactory> database (new AccessFactory());
unique_ptr<InterfaceUser> databaseUser = database->CreateUser();
databaseUser->Insert(*user);
databaseUser->GetUserName(1);
getchar();
return 0;
}
其中new AccessFactory()就是使用Access,替换成 new SQLFactory()就是使用SQL了。
运行结果:
其实这里使用简单工厂会更简单,当然,这只是为了学习抽象工厂方法而且。希望对你有所帮助~ skr~