设计模式学习笔记(3)——原型模式、模板方法模式

先看定义原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

模板方法模式,在一个方法中定义一个算法的骨架,将一些步骤延伸子类中,子类在不改变算法结构的基础上,重新定义算法中的某些步骤。

嗯,一如既往的看不懂定义,上代码。

//父类
class Resume
{
protected:
	char *name;
public:
	Resume() {}
	virtual ~Resume() {}
	virtual Resume* Clone() { return NULL; }
	virtual void Set(char *n) {}
	virtual void Show() {}
};

class ResumeA : public Resume
{
public:
	ResumeA(const char *str);  //构造函数
	ResumeA(const ResumeA &r); //拷贝构造函数
	~ResumeA();                //析构函数
	ResumeA* Clone();          //克隆,关键所在
	void Show();               //显示内容
};
ResumeA::ResumeA(const char *str) 
{
	if(str == NULL) {
		name = new char[1]; 
		name[0] = '\0'; 
	}
	else {
		name = new char[strlen(str)+1];
		strcpy(name, str);
	}
}
ResumeA::~ResumeA() { delete [] name;}
ResumeA::ResumeA(const ResumeA &r) {
	name = new char[strlen(r.name)+1];
	strcpy(name, r.name);
}
ResumeA* ResumeA::Clone() {
	return new ResumeA(*this);
}
void ResumeA::Show() {
	cout<<"ResumeA name : "<<name<<endl; 
}

class ResumeB : public Resume
{
public:
	ResumeB(const char *str);  //构造函数
	ResumeB(const ResumeB &r); //拷贝构造函数
	~ResumeB();                //析构函数
	ResumeB* Clone();          //克隆,关键所在
	void Show();               //显示内容
};
ResumeB::ResumeB(const char *str) 
{
	if(str == NULL) {
		name = new char[1]; 
		name[0] = '\0'; 
	}
	else {
		name = new char[strlen(str)+1];
		strcpy(name, str);
	}
}
ResumeB::~ResumeB() { delete [] name;}
ResumeB::ResumeB(const ResumeB &r) {
	name = new char[strlen(r.name)+1];
	strcpy(name, r.name);
}
ResumeB* ResumeB::Clone() {
	return new ResumeB(*this);
}
void ResumeB::Show() {
	cout<<"ResumeB name : "<<name<<endl; 
}

嗯,似懂非懂,看下调用

int main()
{
	Resume *r1 = new ResumeA("A");
	Resume *r2 = new ResumeB("B");
	Resume *r3 = r1->Clone();
	Resume *r4 = r2->Clone();
	r1->Show(); r2->Show();
	//删除r1,r2
	delete r1; delete r2;	
	r1 = r2 = NULL;
	//深拷贝所以对r3,r4无影响
	r3->Show(); r4->Show();
	delete r3; delete r4;
	r3 = r4 = NULL;
}

哦,核心就是虚基类有个虚拷贝接口函数,子类对应定义实现深拷贝就完了,结果就是不同对象调用拷贝接口,生产的对象不同,over。

再看看模板方法模式,为啥和原型模式放在一起

看定义是看不出名堂了,直接撸代码

// TemplateModel.h文件
#pragma once
#include <iostream>

class AbstractClass
{
public:
	// 定义了一个算法模板
	void templateMethod()
	{
		std::cout << "Operation 0" << std::endl;
		primitiveOperation_0();
		std::cout << "Operation 1" << std::endl;
		primitiveOperation_1();
	}
protected:
	virtual void primitiveOperation_0() = 0;
	virtual void primitiveOperation_1() = 0;
};

class ConcreteClass_0 : public AbstractClass
{
protected:
	virtual void primitiveOperation_0()
	{
		std::cout << "ConcreteClass_0 Operation_0" << std::endl;
	}
	virtual void primitiveOperation_1()
	{
		std::cout << "ConcreteClass_0 Operation_1" << std::endl;
	}
};

class ConcreteClass_1 : public AbstractClass
{
protected:
	virtual void primitiveOperation_0()
	{
		std::cout << "ConcreteClass_1 Operation_0" << std::endl;
	}
	virtual void primitiveOperation_1()
	{
		std::cout << "ConcreteClass_1 Operation_1" << std::endl;
	}
};

结合定义还是很容易理解的,方法templateMethod,整体不变的情况下,想差异化定义其中的一些步骤primitiveOperation_0、primitiveOperation_1,实现就不说了,都一样。

看下调用,嗯,就这回事,没啥好说的。回过头来思考下,把templateMethod实现纯虚化为拷贝构造接口不就是原型模式了?

#include <iostream>
#include "TemplateModel.h"

int main()
{
	using namespace std;
	// 模板方法模式
	AbstractClass *p = new ConcreteClass_0();
	p->templateMethod();
	delete p;

	p = new ConcreteClass_1();
	p->templateMethod();
	delete p;

	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值