设计模式(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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!