(声明:如果想看实例详细解析,请看《大话设计模式》,这里文章只是为了加深学习设计模式印象而自己用C++程序写一遍,以及把代码共享给大家。仅仅是把C#语言换成C++表述,不对书中的程序和例子是否合适做个人表述。)

UML图:

C++重写《大话设计模式》中模式实例三(抽象工厂模式)-LMLPHP

User.h

#pragma once
#include <iostream>
#include <string>

class User {
private:
	int _id;
	std::string name;

public:
	void SetID(int id) { _id = id; }
	int GetID() { return _id; }
	void SetName(std::string name) { this->name = name; }
	std::string GetName() { return name; }
};

IUser.h

#pragma once

#include "User.h"

class IUser {
public:
	virtual void Insert(User* user) = 0;
	virtual User* GetUser(int id) = 0;
};

class SqlserverUser :public IUser {
public:
	virtual void Insert(User* user) {
		std::cout << "在SQL Server 中给User表增加一条记录" << std::endl;
	}
	virtual User* GetUser(int id) {
		std::cout << "在SQL Server中根据ID得到User表的一条记录" << std::endl;
		return NULL;
	}
};

class AccessUser :public IUser {
public:
	virtual void Insert(User* user) {
		std::cout << "在Access中给User表增加一条记录" << std::endl;
	}
	virtual User* GetUser(int id) {
		std::cout << "在Access中根据ID得到User表一条记录" << std::endl;
		return NULL;
	}
};

 Department.h

#pragma once
#include <iostream>
#include <string>

class Department {
private:
	int _id;
	std::string deptName;

public:
	void SetID(int id) { _id = id; }
	int GetID() { return _id; }
	void SetDeptName(std::string deptName) { this->deptName = deptName; }
	std::string GetDeptName() { return deptName; }
};

IDepartment.h:

 

#pragma once

#include "Department.h"

class IDepartment {
public:
	virtual void Insert(Department* department) = 0;
	virtual Department* GetDepartment(int id) = 0;
};

class SqlserverDepartment :public IDepartment{
public:
	virtual void Insert(Department* department) {
		std::cout << "在SQL Sever中给Department表增加一条记录" << std::endl;
	}
	virtual Department* GetDepartment(int id) {
		std::cout << "在SQL Server中根据ID得到Department表一条记录" << std::endl;
		return NULL;
	}
};

class AccessDepartment :public IDepartment {
public:
	virtual void Insert(Department* department) {
		std::cout << "在Access中给Department表增加一条记录" << std::endl;
	}
	virtual Department* GetDepartment(int id) {
		std::cout << "在Access中根据ID得到Department表一条记录" << std::endl;
		return NULL;
	}
};

 IFactory.h

#pragma once
#include "IUser.h"
#include "IDepartment.h"

class IFactory {
public:
	virtual IUser* CreateUser() = 0;
	virtual IDepartment* CreateDepartment() = 0;
};

class SqlServerFactory :public IFactory {
public:
	virtual IUser* CreateUser() {
		return new SqlserverUser();
	}
	virtual IDepartment* CreateDepartment() {
		return new SqlserverDepartment();
	}
};

class AccessFactory :public IFactory {
public:
	virtual IUser* CreateUser(){
		return new AccessUser();
	}
	virtual IDepartment* CreateDepartment() {
		return new AccessDepartment();
	}
};

 main.cpp

#include "IFactory.h"
#include <cstdlib>

int main() {
	//IFactory* factory = new SqlServerFactory();//选择使用SqlServer数据库
	IFactory* factory = new AccessFactory();//选择和初始化Access数据库
	User *user = new User();//创建用户表
	IUser* iu = factory->CreateUser();
	iu->Insert(user);
	iu->GetUser(1);

	Department *dept = new Department();//创建部门表
	IDepartment *id = factory->CreateDepartment();
	id->Insert(dept);
	id->GetDepartment(1);

	delete dept;
	delete iu;
	delete user;
	delete factory;
	system("pause");
	return 0;
}

运行结果:

 C++重写《大话设计模式》中模式实例三(抽象工厂模式)-LMLPHP

 

10-03 16:52