前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
前言
工厂方法模式中一个工厂只负责生产一种产品,在抽象工厂模式中一个工厂可以生产一系列的产品。
实现举例
- 场景描述
假设一个简单的数据管理系统:有两个 Student (学生表)和 Grades(分数)两个对象表,一般对于一个对象表需要提供了对数据库操作(增、删、改、查)的类,然而在使用过程中数据库是可能进行更换的,比如 Access 切换到 Oracel。 - 产品类
①.Student 类
class Student
{
public:
Student(){}
};
②.Grades类
class Grades
{
public:
Grades(){}
};
- 数据库操作抽象基类
①.StudentHelper 类
#include "student.h"
class StudentHelper
{
public:
StudentHelper(){};
virtual void saveStudent(const Student &) = 0;
virtual Student getStudent(int id)= 0;
virtual ~StudentHelper() {}
};
②.GradesHelper 类
#include "grades.h"
class GradesHelper
{
public:
GradesHelper(){}
virtual void saveGrades(const Grades &) = 0;
virtual Grades getGrades(int id) = 0;
virtual ~GradesHelper(){}
};
- 数据库操作派生类
①.StudentHelperAccess 类
#include <iostream>
#include "studenthelper.h"
using namespace std;
class StudentHelperAccess : public StudentHelper
{
public:
StudentHelperAccess(){}
void saveStudent(const Student &) override
{
cout << "使用 Access 数据库保存一个 Student 对象"<<endl;
}
Student getStudent(int id) override
{
cout << "从 Access 数据库查询一个 Student 对象"<<endl;
}
};
②.StudentHelperOracel 类
#include <iostream>
#include "studenthelper.h"
using namespace std;
class StudentHelperOracel : public StudentHelper
{
public:
StudentHelperOracel(){}
void saveStudent(const Student &) override
{
cout << "使用 Oracel 数据库保存一个 Student 对象"<<endl;
}
Student getStudent(int id) override
{
cout << "从 Oracel 数据库查询一个 Student 对象"<<endl;
}
};
③.GradesHelperAccess 类
#include <iostream>
#include "gradeshelper.h"
using namespace std;
class GradesHelperAccess : public GradesHelper
{
public:
GradesHelperAccess(){}
void saveGrades(const Grades &) override
{
cout << "使用 Access 数据库保存一个 Grades 对象"<<endl;
}
Grades getGrades(int id) override
{
cout << "从 Access 数据库查询一个 Grades 对象"<<endl;
}
};
④.GradesHelperOracel 类
#include <iostream>
#include "gradeshelper.h"
using namespace std;
class GradesHelperOracel : public GradesHelper
{
public:
GradesHelperOracel(){}
void saveGrades(const Grades &) override
{
cout << "使用 Oracel 数据库保存一个 Grades 对象"<<endl;
}
Grades getGrades(int id) override
{
cout << "从 Oracel 数据库查询一个 Grades 对象"<<endl;
}
};
- 工厂抽象基类
#include "studenthelper.h"
#include "gradeshelper.h"
class DbHelper
{
public:
DbHelper(){}
virtual ~DbHelper(){}
virtual StudentHelper * createStudentHelper() =0;
virtual GradesHelper * createGradesHelper() = 0;
};
- 工厂派生类
①.DbHelperAccess 类
#include "dbhelper.h"
#include "studenthelperaccess.h"
#include "gradeshelperaccess.h"
class DbHelperAccess : public DbHelper
{
public:
DbHelperAccess(){}
StudentHelper * createStudentHelper() override
{
return new StudentHelperAccess();
}
GradesHelper * createGradesHelper() override
{
return new GradesHelperAccess();
}
};
②.DbHelperOracel类
#include "dbhelper.h"
#include "studenthelperoracel.h"
#include "gradeshelperoracel.h"
class DbHelperOracel : public DbHelper
{
public:
DbHelperOracel(){}
StudentHelper * createStudentHelper() override
{
return new StudentHelperOracel ();
}
GradesHelper * createGradesHelper() override
{
return new GradesHelperOracel ();
}
};
- 客户端调用
#include "student.h"
#include "grades.h"
#include "dbhelperaccess.h"
#include "dbhelperoracel.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建工厂类,若需要更换数据库,仅改这一处即可
DbHelper *dbhelper = new DbHelperAccess ();
cout << "*****对 Student 的操作*****"<<endl;
Student student1;
StudentHelper * studenthelper = dbhelper->createStudentHelper();
studenthelper->saveStudent(student1);
studenthelper->getStudent(0);
cout << "*****对 Grades 的操作*****"<<endl;
Grades grades1;
GradesHelper * gradeshelper = dbhelper->createGradesHelper();
gradeshelper->saveGrades(grades1);
gradeshelper->getGrades(0);
delete gradeshelper;
delete studenthelper;
delete dbhelper;
return a.exec();
}