c语言 prototype_(创建型模式)Prototype——原型模式

原型模式是一种创建型设计模式,它通过提供一个原型对象来创建同类的新对象。在C语言中,通过继承和虚函数实现Clone接口,实现对象的复制。此模式允许动态增加或减少产品类,无需关注创建细节,适用于初始化信息不变的情况。需要注意浅复制和深复制的区别,以及正确处理指针和引用类型的字段复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、意图 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2、核心思想

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构。

3、优缺点分析

GOOD:

从一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。并能提高创建的性能。 说白了就COPY技术,把一个对象完整的COPY出一份。

一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。

BAD:

缺点是每一个类都必须配备一个复制方法。

必须注意:

浅复制和深复制的问题:如果字段是基本数据类型的,则用拷贝构造函数即可进行逐位复制,但如果字段是指针或引用类型的,则复制就不仅仅要复制指针和引用本身,还需要对其所指的实际数据对象进行复制。

4、标准UML图

抽象基类:

1)Prototype:虚拟基类,所有原型的基类,提供Clone接口函数

接口函数:

1)Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象

解析:

原型模式实际就是常说的用虚函数模拟实现“虚拟构造函数”,C++的实现机制中并没有虚拟构造函数这个性质,但是通过不同派生类实现的Clone接口函数可以完成与“虚拟构造函数”同样的效果。

所以,生成一个新的对象,就是需要创建一个实际提供服务的对象,就需要一个已经存在的原型,和通过该原型对象创建实际服务对象的方法。

4、标准源码

1: #ifndef PROTOTYPE_H2: #define PROTOTYPE_H3:4: // 虚拟基类,所有原型的基类,提供Clone接口函数5: class Prototype6: {7: public:8: Prototype(){}9: virtual ~Prototype(){}10:11: virtual Prototype* Clone() = 0;12: };13:14: // 派生自Prototype,实现Clone方法15: class ConcreatePrototype116: : public Prototype17: {18: public:19: ConcreatePrototype1();20: ConcreatePrototype1(const ConcreatePrototype1&);21: virtual ~ConcreatePrototype1();22:23: virtual Prototype* Clone();24: };25:26: // 派生自Prototype,实现Clone方法27: class ConcreatePrototype228: : public Prototype29: {30: public:31: ConcreatePrototype2();32: ConcreatePrototype2(const ConcreatePrototype2&);33: virtual ~ConcreatePrototype2();34:35: virtual Prototype* Clone();36: };37:38: #endif

1: #include "Prototype.h"2: #include 3:4: ConcreatePrototype1::ConcreatePrototype1()5: {6: std::cout << "construction of ConcreatePrototype1\n";7: }8:9: ConcreatePrototype1::~ConcreatePrototype1()10: {11: std::cout << "destruction of ConcreatePrototype1\n";12: }13:14: ConcreatePrototype1::ConcreatePrototype1(const ConcreatePrototype1&)15: {16: std::cout << "copy construction of ConcreatePrototype1\n";17: }18:19: Prototype* ConcreatePrototype1::Clone()20: {21: return new ConcreatePrototype1(*this);22: }23:24: ConcreatePrototype2::ConcreatePrototype2()25: {26: std::cout << "construction of ConcreatePrototype2\n";27: }28:29: ConcreatePrototype2::~ConcreatePrototype2()30: {31: std::cout << "destruction of ConcreatePrototype2\n";32: }33:34: ConcreatePrototype2::ConcreatePrototype2(const ConcreatePrototype2&)35: {36: std::cout << "copy construction of ConcreatePrototype2\n";37: }38:39: Prototype* ConcreatePrototype2::Clone()40: {41: return new ConcreatePrototype2(*this);42: }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值