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

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;
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值