Tsai笔记:C++设计模式学习(6)—— 原型模式(ProtoType)

Tsai笔记:C++设计模式学习(6)—— 原型模式(ProtoType)

设计模式的系列笔记链接如下:

Tsai笔记:C++设计模式学习(1)—— 设计模式介绍及分类

Tsai笔记:C++设计模式学习(2)—— 单例模式(Singleton)

Tsai笔记:C++设计模式学习(3)—— 享元模式(Flyweight)

Tsai笔记:C++设计模式学习(4)—— 工厂模式方法(Factory Method)

Tsai笔记:C++设计模式学习(5)—— 抽象工厂模式(Abstract Factory)

Tsai笔记:C++设计模式学习(6)—— 原型模式(ProtoType)

一、模式定义

 原型模式:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。                 ——《设计模式》Gof

二、要点总结

  • ProtoType模型同样用于隔离对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
  • ProtoType模型对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅注册一个新类的对象(即原型),然后在任何需要的地方Clone。
  • ProtoType模型中的Clone方法可以利用某些框架中的序列化来实现深拷贝。

三、C++ 代码呈现

享元模式主要函数:Flyweight.h

//ProtoType.h
#include <iostream>
//抽象类
class ISplitter {
public:
	virtual void split() = 0;
	virtual ISplitter* clone() = 0; //通过克隆自己来创建对象
	virtual ~ISplitter() {};
};

//具体类
class BinarySplitter : public ISplitter {
private:
	BinarySplitter(const BinarySplitter&);
public:
	BinarySplitter() {};
	virtual void split();
	virtual ISplitter* clone();
};

BinarySplitter::BinarySplitter(const BinarySplitter&) {
	std::cout << " === BinarySplitter Copy Construct!" << std::endl;
}

void BinarySplitter::split() {
	std::cout << " --- BinarySplitter Work ! " << std::endl;
}

ISplitter* BinarySplitter::clone() {
	return new BinarySplitter(*this);
}

class TxtSplitter : public ISplitter {
private:
	TxtSplitter(const TxtSplitter&);
public:
	TxtSplitter() {};
	virtual void split();
	virtual ISplitter* clone();
};

TxtSplitter::TxtSplitter(const TxtSplitter&) {
	std::cout << " === TxtSplitter Copy Construct!" << std::endl;
}

void TxtSplitter::split() {
	std::cout << " --- TxtSplitter Work ! " << std::endl;
}

ISplitter* TxtSplitter::clone() {
	return new TxtSplitter(*this);
}

class PictureSplitter : public ISplitter {
private:
	PictureSplitter(const PictureSplitter&);
public:
	PictureSplitter() {};
	virtual void split();
	virtual ISplitter* clone();
};

PictureSplitter::PictureSplitter(const PictureSplitter&) {
	std::cout << " === PictureSplitter Copy Construct!" << std::endl;
}

void PictureSplitter::split() {
	std::cout << " --- PictureSplitter Work ! " << std::endl;
}

ISplitter* PictureSplitter::clone() {
	return new PictureSplitter(*this);
}

class VideoSplitter : public ISplitter {
private:
	VideoSplitter(const VideoSplitter&);
public:
	VideoSplitter() {};
	virtual void split();
	virtual ISplitter* clone();
};

VideoSplitter::VideoSplitter(const VideoSplitter&) {
	std::cout << " === VideoSplitter Copy Construct!" << std::endl;
}

void VideoSplitter::split() {
	std::cout << " --- VideoSplitter Work ! " << std::endl;
}

ISplitter* VideoSplitter::clone() {
	return new VideoSplitter(*this);
}

class MainForm{
private:
	ISplitter*  prototype;//原型对象
public:
	MainForm(ISplitter*  prototype) {
		this->prototype = prototype;
	}

	void Work() {
		ISplitter* splitter = prototype->clone(); //克隆原型
		splitter->split();
	}
};

测试函数:main.cpp

#include <ProtoType.h>

int main()
{
	BinarySplitter binary;
	TxtSplitter txt;
	PictureSplitter picture;
	VideoSplitter video;

	MainForm Splitter_b(&binary);
	Splitter_b.Work();

	MainForm Splitter_t(&txt);
	Splitter_t.Work();

	MainForm Splitter_p(&picture);
	Splitter_p.Work();

	MainForm Splitter_v(&video);
	Splitter_v.Work();

	return 0;
}

 输出结果为:

 === BinarySplitter Copy Construct!
 --- BinarySplitter Work !
 === TxtSplitter Copy Construct!
 --- TxtSplitter Work !
 === PictureSplitter Copy Construct!
 --- PictureSplitter Work !
 === VideoSplitter Copy Construct!
 --- VideoSplitter Work !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值