C++抽象基类的实例化(抽象工厂模式)

今天学习设计模式《抽象工厂模式》,参考了两个博客:

http://blog.csdn.net/wuzhekai1985/article/details/6660462

http://www.cnblogs.com/wanggary/archive/2011/04/13/2015288.html

然后按照第二个博客的意见,应用类模板实现工厂类;中间出现一个不能实例化抽象基类的问题,通过查资料,然后另外新建一个工程实验后知道:

1,抽象类是不能初始化的(最基本的,大家都知道的)

2,如果抽象基类的派生类有哪怕只有一个函数没有实现,这个抽象基类仍然不能实例化;即需要将抽象基类中定义的虚接口函数全部在派生类中实现(说的不太专业。。。)

代码如下:

//core.h
#ifndef _CORE_H_
#define _CORE_H_

class Core{
public:
	Core(){}
	virtual ~Core(){}
	virtual void NumOfCore() = 0;
	virtual void SpeedOfCore() = 0;
	virtual void VersionOfCore() = 0;
};
#endif
<pre name="code" class="cpp">//multicore.h
#ifndef _MULTICORE_H_
#define _MULTICORE_H_

#include"core.h"
#include<iostream>
using namespace std;

class MultiCore :public Core{
public:
	MultiCore(){}
	~MultiCore(){}
	void NumOfCore(){
		cout << "multicore" << endl;
	}
	void SpeedOfCore(){
		cout << "speed fast" << endl;
	}
	virtual void VersionOfCore() = 0;
};
#endif
<pre name="code" class="cpp">//singlecore.h
#ifndef _SINGLECORE_H_
#define _SINGLECORE_H_

#include"core.h"
#include<iostream>
using namespace std;

class SingleCore :public Core{
public:
	SingleCore(){}
	~SingleCore(){}
	void NumOfCore(){
		cout << "singlecore" << endl;
	}
	void SpeedOfCore(){
		cout << "speed slow" << endl;
	}
	virtual void VersionOfCore() = 0;
};
#endif
<pre name="code" class="cpp">//newmulticore.h
#ifndef _NEWMULTICORE_H_
#define _NEWMULTICORE_H_

#include"multicore.h"

class NewMultiCore :public MultiCore{
public:
	NewMultiCore(){}
	~NewMultiCore(){}
	void VersionOfCore(){
		cout << "new multi version core" << endl;
	}
};

#endif
<pre name="code" class="cpp">//newsinglecore.h
#ifndef _NEWSINGLECORE_H_
#define _NEWSINGLECORE_H_

#include"singlecore.h"

class NewSingleCore :public SingleCore{
public:
	NewSingleCore(){}
	~NewSingleCore(){}
	void VersionOfCore(){
		cout << "new single version core" << endl;
	}
};
#endif
<pre name="code" class="cpp">//oldmulticore.h
#ifndef _OLDMULTICORE_H_
#define _OLDMULTICORE_H_

#include"multicore.h"

class OldMultiCore :public MultiCore{
public:
	OldMultiCore(){}
	~OldMultiCore(){}
	void VersionOfCore(){
		cout << "old multi version core" << endl;
	}
};

#endif
<pre name="code" class="cpp">//oldsinglecore.h
#ifndef _OLDSINGLECORE_H_
#define _OLDSINGLECORE_H_

#include"singlecore.h"

class OldSingleCore :public SingleCore{
public:
	OldSingleCore(){}
	~OldSingleCore(){}
	void VersionOfCore(){
		cout << "old single version core" << endl;
	}
};

#endif
<pre name="code" class="cpp">//factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_

#include"core.h"

class Factory{
public:
	Factory(){}
	virtual ~Factory(){}
	virtual Core* CreateSingleCore() = 0;
	virtual Core* CreateMultiCore() = 0;
};

#endif
 
<pre name="code" class="cpp">//newversionfactory.h
#ifndef _NEWVERSIONFACTORY_H_
#define _NEWVERSIONFACTORY_H_

#include"factory.h"

template<class T>
class NewVersionFactory :public Factory
{
public:
	NewVersionFactory();
	~NewVersionFactory();
	Core* CreateMultiCore();
	Core* CreateSingleCore();
};

template<class T>
NewVersionFactory<T>::NewVersionFactory(){}
template<class T>
NewVersionFactory<T>::~NewVersionFactory(){}
template<class T>
Core* NewVersionFactory<T>::CreateMultiCore()
{
	return new T;
}
template<class T>
Core* NewVersionFactory<T>::CreateSingleCore()
{
	return new T;
}

#endif
//oldversionfactory.h
#ifndef _OLDVERSIONFACTORY_H_
#define _OLDVERSIONFACTORY_H_

#include"factory.h"

template<class T>
class OldVersionFactory :public Factory
{
public:
	OldVersionFactory();
	~OldVersionFactory();
	Core* CreateMultiCore();
	Core* CreateSingleCore();
};

template<class T>
OldVersionFactory<T>::OldVersionFactory(){}
template<class T>
OldVersionFactory<T>::~OldVersionFactory(){}
template<class T>
Core* OldVersionFactory<T>::CreateMultiCore()
{
	return new T;
}
template<class T>
Core* OldVersionFactory<T>::CreateSingleCore()
{
	return new T;
}

#endif
//main.cpp
#include"core.h"
#include"factory.h"
#include"multicore.h"
#include"singlecore.h"
#include"newversionfactory.h"
#include"oldversionfactory.h"
#include"newmulticore.h"
#include"newsinglecore.h"
#include"oldmulticore.h"
#include"oldsinglecore.h"

void main()
{
	Factory* pFactoryMultiCore = new NewVersionFactory<NewMultiCore>();
	pFactoryMultiCore->CreateMultiCore()->NumOfCore();
	pFactoryMultiCore->CreateMultiCore()->SpeedOfCore();
	pFactoryMultiCore->CreateMultiCore()->VersionOfCore();
	delete pFactoryMultiCore;
	pFactoryMultiCore = NULL;

	Factory* pFactorySingleCore = new OldVersionFactory<OldSingleCore>();
	pFactorySingleCore->CreateSingleCore()->NumOfCore();
	pFactorySingleCore->CreateSingleCore()->SpeedOfCore();
	pFactorySingleCore->CreateSingleCore()->VersionOfCore();
	delete pFactorySingleCore;
	pFactorySingleCore = NULL;

}


 
 
 
 
 
 
 

                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 请创建一个抽象类DataStructure,该类包括下面的成员变量和成员函数: 1) 一个成员变量len,表示里面的元素个数最大值 2) 构造函数DataStructure(int l),将len初始为0 3) 虚析构函数~DataStructure() 4) 纯虚函数Output(),输出DataStructure中的数据 5) 纯虚函数Size(),返回DataStructure中的元素个数 2. 请创建DataStructure的一个派生类MyString,该类包括下面的成员变量和成员函数: 1) 一个成员变量char* data,表示里面的数据 2) 构造函数MyString(int max_size),将MyString初始为空串,最大元素个数为max_size 3) 析构函数~MyString(),释放相应的数据 4) Input()函数,往MyString输入数据 5) 重载operator+=()函数,实现两个字符串的连接 6) 重定义Output()和Size()函数 3. 请创建DataStructure的一个派生类MyStack,该类包括下面的成员变量和成员函数: 1) 一个成员变量int* data,用于里面的数据 2) 一个成员变量int top,表示最上面的元素下标 3) 构造函数MyStack(int max_size),将MyStack初始为空栈,最大元素个数为max_size 4) 析构函数~MyStack(),释放相应的数据 5) Push_back(int e)函数,往栈里面压入一个数据e 6) 重定义Output()和Size()函数 4. 请编写main函数,测试上面程序的正确性 1) 创建两个MyString的对象str1和str2,分别调用Input函数输入str1和str2,然后分别调用operator+=函数将str2连接到str1的末尾 2) 创建一个MyStack的对象stack,调用Push_back函数输入往stack中输入m(m < max_size)个数据 3) 创建一个长度为3的DataStructure*类型的数组,将其3个元素分别指向str1, str2, stack,然后编写for循环调用Size()和Output()函数输出每个元素的大小和内容。 5. 输入输出样例: 1) 输入样例 A promising techni que for checking reachability 4 12 23 34 45 2) 输出样例 47 A promising technique for checking reachability 29 que for checking reachability 4 12 23 34 45

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值