设计模式(2)--对象创建(4)--原型

2023-12-13 16:35:22
1. 意图

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

2. 两种角色

? ? 抽象原型(Prototype)、具体原型(Concrete Prototype)

3. 优点

? ? 3.1 对客户隐藏了具体的产品类

? ? 3.2 可以在运行时刻增加和删除产品

? ? 3.3 可以极大地减少系统所需要的类的数目

? ? 3.4 改变结构可以指定新对象

? ? 3.5 可以减少子类的构造

? ? 3.6 用类动态配置应用

4. 缺点

? ? 4.1 每一个原型的子类都必须实现Clone操作

? ? ? ? ? ?这可能很困难,当内部有不支持拷贝或循环引用的对象时。

5. 相关模式

? ? 5.1 原型和抽象工厂在某种方面是相互竞争的,但它们也可以一起使用。

? ? ? ? ? 抽象工厂可以存储一个被克隆的原型的集合,并且返回产品对象。

? ? 5.2 大量使用Composite和Decorator模式的设计通常可以从原型模式处获益。

6. 代码示意(C++)
#pragma once
#include<iostream>
#include <string>
using namespace std;


class Prototype
{
protected:
	string m_strName;
public:
	Prototype(){}
	Prototype(const string &strName) 
	{
		m_strName = strName;
	}
	void Show()
	{
		cout << m_strName << endl;
	}
public:
	virtual Prototype* Clone() = 0;
};

class ConcretePrototype1 : public Prototype
{
public:
	ConcretePrototype1(const string &strName) : Prototype(strName) {}
	ConcretePrototype1(const ConcretePrototype1 &other) 
	{
		m_strName = "Copy_" + other.m_strName;
	}
public:
	virtual Prototype* Clone()
	{
		return new ConcretePrototype1(*this);
	}
};

class ConcretePrototype2 : public Prototype
{
public:
	ConcretePrototype2(const string &strName) : Prototype(strName) {}
	ConcretePrototype2(const ConcretePrototype2 &other) 
	{
		m_strName = "Copy_"+other.m_strName;
	}
public:
	virtual Prototype* Clone()
	{
		return new ConcretePrototype2(*this);
	}
};
#include "ProtoType.h"
int main() {

	Prototype* pPrototype1 = new ConcretePrototype1("ConcretePrototype1");
	pPrototype1->Show();

	Prototype* pPrototype2 = pPrototype1->Clone();
	pPrototype2->Show();

	delete pPrototype1;
	delete pPrototype2;

	return 0;
}

运行结果:

文章来源:https://blog.csdn.net/myepicure/article/details/134779956
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。