设计模式(2) 抽象工厂(一) 学生成绩管理系统设计

续上篇 工厂模式(一) 学生成绩管理设计

一个实体"根类" Entity , 派生出三种类——老师,学生,课程

一个接口工厂,派生出三种工厂,分别 Create 老师,学生,课程

可以考虑,不同学院之间的老师,学生,课程是不同的,例如计算机学院和经济管理学院的教师(假设无重叠),学生,课程(课程大多是不同的)。

现在,我想要产生老师的工厂,可以产生不同学院的老师,例如——这个特制工厂,可以产生计算机学院的老师,也可以产生经济管理学院的老师。

所以,在接口工厂中,需要对接口进行分类——产生计算机学院的,产生经济管理学院的,产生...... 学院的

// 计算机学院的实体
virtual Entity* Computer_Create_Entity ( const int NO , const string& name ) = 0 ;
// 经济管理学院的实体
virtual Entity* Economic_Create_Entity ( const int NO , const string& name ) = 0 ;

在实现的各类工厂中,就要实现接口工厂的分类

“教师工厂”

class Teacher_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Teacher ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Teacher ( NO , name , "经济管理学院") ;
		Litter.emplace_back ( One ) ;    // 因为要返回, 暂不直接 emplace_back 构造
		return One ;
	}
} ;

“学生工厂”

class Student_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Student ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Student ( NO , name , "经济管理学院") ;
		Litter.emplace_back ( One ) ;    
		return One ;
	}
} ;

“课程工厂”

class Course_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Course ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Course ( NO , name , "经济管理学院" ) ;
		Litter.emplace_back ( One ) ;    
		return One ;
	}
} ;

再给每个 Entity 加上一个 const char* institution (或者 string),以表征属性

全部代码如下:

#include <bits/stdc++.h>
#define rep( i , j , n ) for ( int i = int(j) ; i < int(n) ; ++i )
#define dew( i , j , n ) for ( int i = int(n-1) ; i > int(j) ; --i )
#define _PATH __FILE__ , __LINE__
typedef std::pair < int , int > P ;
using std::cin ;
using std::cout ;
using std::endl ;
using std::string ;
// 声明一个 enum class
enum class Product {
	Student , Teacher , Course 
} ;
enum class Institution {
	Computer , Economic , Mathmathics
} ;

class Entity {
protected:
	int NO ;
public:
	string name ;
	const char* institution ;
	explicit Entity ( const int _NO , const string& _name 
				, const char* _institution ) 
		: NO ( _NO ) 
		, name ( std::move ( _name ) ) 
		, institution ( _institution )
	{}
	virtual ~Entity () = default ;
	virtual void display () const = 0 ;
} ;

class Teacher : public Entity {
private:
	double salary ;
public:
	explicit Teacher ( const int _NO , const string& _name 
				, const char* _institution ) 
		: Entity ( _NO , _name , _institution ) 
		, salary ( 10000 ) 
	{}
	void display () const override {
		cout << endl << institution << "\t教师工号  :  " << NO << "\t" << name ;
		cout << "\t\t薪水  :  " << salary << endl ;
	}
} ;

class Student : public Entity {
public:
	explicit Student ( const int _NO , const string& _name 
				, const char* _institution ) 
		: Entity ( _NO , _name , _institution ) 
	{}
	void display () const override {
		cout << endl << institution << "\t学生学号  :  " << NO << "\t" << name << endl ;
	}
} ;

class Course : public Entity {
public:
	explicit Course ( const int _NO , const string& _name 
				, const char* _institution ) 
		: Entity ( _NO , _name , _institution ) 
	{}
	void display () const override {
		cout << endl << institution << "\t课程编号  :  " << NO << "\t" << name << endl ;
	}
} ;

class Factory {
protected:
	// 一个静态的垃圾收集器, 收集由该工厂的子类产生的 Entity* 指针
	static std::vector< Entity* > Litter ;
private:
	// 这个函数用 atexit 登记, main 函数结束之后启动 // 设置为私有, 只能接口释放
	static void End_OK () {
		for ( auto &it : Litter ) 
			if ( it != nullptr ) 
				delete it ;
		Litter.shrink_to_fit () ;   // 清空容器
	}
public:
	Factory () {
		// 设置一个 once_flag, 只登记一次
		static std::once_flag flag ;   
		std::call_once ( flag , [&] () { atexit ( End_OK ) ; } ) ;
	}
	virtual ~Factory () = default ;
	// 计算机学院的实体
	virtual Entity* Computer_Create_Entity ( const int NO , const string& name ) = 0 ;
	// 经济管理学院的实体
	virtual Entity* Economic_Create_Entity ( const int NO , const string& name ) = 0 ;
} ;
// 静态变量的类外声明
std::vector< Entity* > Factory::Litter ;


class Teacher_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Teacher ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Teacher ( NO , name , "经济管理学院") ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集  // 因为要返回, 暂不直接 emplace_back 构造
		return One ;
	}
} ;

class Student_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Student ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Student ( NO , name , "经济管理学院") ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集
		return One ;
	}
} ;

class Course_Factory : public Factory {
public:
	Entity* Computer_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Course ( NO , name , "计算机学院" ) ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集
		return One ;
	}
	Entity* Economic_Create_Entity ( const int NO , 
				const string& name ) override {
		Entity* One = new Course ( NO , name , "经济管理学院" ) ;
		Litter.emplace_back ( One ) ;    // 垃圾收集器收集
		return One ;
	}
} ;

int main () {
	Factory* A = new Teacher_Factory () ;
	Factory* B = new Student_Factory () ;
	Factory* C = new Course_Factory () ;

	cout << endl << "以下是计算机学院的师生课程情况" << endl ;
	Entity* E = A->Computer_Create_Entity ( 1000001 , "张" ) ; 
	Entity* F = B->Computer_Create_Entity ( 2000001 , "杨" ) ; 
	Entity* G = C->Computer_Create_Entity ( 3000001 , "数据结构" ) ; 
	E->display () ;
	F->display () ;
	G->display () ;

    cout << endl << "以下是经济管理学院的师生课程情况" << endl ;
	Entity* H = A->Economic_Create_Entity ( 1000002 , "谭" ) ; 
	Entity* I = B->Economic_Create_Entity ( 2000002 , "丁" ) ; 
	Entity* J = C->Economic_Create_Entity ( 3000002 , "资本论" ) ; 
	H->display () ;
	I->display () ;
	J->display () ;
    
	delete A , delete B , delete C ;
	A = B = C = nullptr ;
	return 0 ;
}

程序结果:

可以考虑,把这些老师,学生,课程全部集成到一个“系统类”中,统一管理,也是数据交流的重要媒介,这个系统类就是学生成绩管理系统的“服务端”了。

如果要做交互,就还需要一个字符或者图形界面——也可以抽象成一个类,作为用户,就是学生成绩管理系统的“客户端”了。

如果要做多用户,可以考虑把用户也作为工厂的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值