设计模式精解之——Prototype模式

c++实现设计模式——Prototype模式 c++实现设计模式——Prototype模式 什么是Prototype模式 Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。 结构图 为什么用Prototype模式 什么是Prototype模式,我相信网上有一堆的解释,但是我们要理解为什么要用,用了有什么好处,这才是最重要的,先说结论,什么场景下要用: 要创建很多个对象 每个对象属性很类似,只有少量区别,如果一个是鸡一个是. 阅读详情

0 引言

0.1 目的

       本文档给出设计模式之——Prototype模式的简化诠释,并给出其C++实现。

0.2 说明

Project

Design Pattern Explanation(By K_Eckel)

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05(Cherry blossom is Beautiful)

Test Bed

MS Visual C++ 6.0

0.3 参考

       在本文档的写作中,参考了以下的资源,在此列出表示感谢:

u       书籍

[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software

Addison-Wesley 2000/9.

        [Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

0.4 联系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of Computer Wuhan University

E_mail

frwei@whu.edu.cn 

2 Prototype模式

2.1 问题

       关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的3根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。

2.2 模式选择

       Prototype模式典型的结构图为:

            图2-1:Prototype Pattern结构图

    Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现之。

2.3 实现

2.3.1 完整代码示例(code)

       Prototype模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1:Prototype.h
//Prototype.h

#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_

class Prototype
{
public:
 virtual ~Prototype();

 virtual Prototype* Clone() const = 0;

protected:
 Prototype();

private:

};

class ConcretePrototype:public Prototype
{
public:
 ConcretePrototype();

 ConcretePrototype(const ConcretePrototype& cp);

 ~ConcretePrototype();

 Prototype* Clone() const;

protected:

private:

};

#endif //~_PROTOTYPE_H_

代码片断2:Prototype.cpp
//Prototype.cpp

#include "Prototype.h"
#include <iostream>
using namespace std;

Prototype::Prototype()
{

}

Prototype::~Prototype()
{

}

Prototype* Prototype::Clone() const
{
 return 0;
}

ConcretePrototype::ConcretePrototype()
{

}

ConcretePrototype::~ConcretePrototype()
{

}

ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
 cout<<"ConcretePrototype copy ..."<<endl;
}

Prototype* ConcretePrototype::Clone() const
{
 return new ConcretePrototype(*this);
}

代码片断3:main.cpp
//main.cpp

#include "Prototype.h"

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{

 Prototype* p = new ConcretePrototype();

 Prototype* p1 = p->Clone();

 return 0;
}

2.3.2 代码说明

Prototype模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方

式,这也是C++实现技术层面上的事情。由于在示例代码中不涉及到深层拷贝(主要指有指针、复合对象的情况),因此我们通过编译器提供的默认的拷贝构造函数(按位拷贝)的方式进行实现。说明的是这一切只是为了实现简单起见,也因为本文档的重点不在拷贝构造函数的实现技术,而在Prototype模式本身的思想。

2.4 讨论

       Prototype模式通过复制原型(Prototype)而获得新对象创建的功能,这里Prototype本身就是“对象工厂”(因为能够生产对象),实际上Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。 

【Godot】构建可维护的游戏工程 —— 项目代码组织结构 本文系统梳理了Godot引擎项目组织原则与架构模式,提出场景中心化、命名规范一致性和资源隔离三大核心原则。推荐按功能模块划分目录结构(如scenes/、entities/、systems/),采用snake_case命名避免跨平台问题,并通过.gdignore优化资源管理。文章详细解析了自包含场景设计、信号驱动解耦等架构技巧,以及团队协作中的版本控制策略,强调通过模块化设计平衡一致性与实用性。最终目标构建清晰可维护的项目结构,使资源定位和功能扩展更加高效。(148字) 阅读详情

相关推荐

SAP子公司财务账套配置实战:从公司代码到记账期间变式的关键步骤

本文详细介绍了为SAP子公司快速配置财务账套的实战步骤。通过复用母公司成熟配置,重点阐述了从创建公司代码、关联控制范围到分配记账期间变式的核心流程,帮助顾问在一两个小时内完成核心骨架搭建,实现高效集团财务管控。

cake8的博客 166

23种设计模式学习—Prototype模式

Prototype模式 看了k_eckel写的pdf觉得很好, 本来把pdf的内容抓过来好好的,一提交确全没了.郁闷啊!重新来过... 1.问题 Prototype模式 关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的3根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。Prototype模式也正是提供了自我复制的功能,就是说新对象

zhujinqiang的专栏 2272

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4767

23种设计模式(C++)之原型(Prototype)模式

23种设计模式(C++)之原型(Prototype)模式23种设计模式(C++)之原型(Prototype)模式概念意图理解提醒实例具体类实例创建汽车具体类客户端测试Result:Analysis:抽象类实例创建汽车抽象类创建电动汽车类客户端测试Result 23种设计模式(C++)之原型(Prototype)模式 概念 原型(Prototype)模式,是一种对象创建型模式。 意图 用原型实例指定...

u012409346的博客 257

从零构建SOEM主站:基于STM32的EtherCAT伺服控制实战指南

本文详细介绍了如何从零构建基于STM32的SOEM主站系统,实现EtherCAT伺服电机的高精度控制。通过硬件选型、SOEM协议栈移植、PDO/SDO配置优化等实战步骤,帮助开发者掌握工业自动化中的关键运动控制技术,特别适用于23位编码器伺服电机的应用场景。

weixin_29186249的博客 666

表格数据学习的图神经网络综述

今天学习一篇发表在中科院一区期刊《ACM Computing Surveys》的综述文章《Graph Neural Networks for Tabular Data Learning: A Survey with Taxonomy & Directions》,该刊主要刊载计算机理论方法领域的系统性综述与教程论文,注重跨学科技术融合研究,最新的影响因子为28.0。本文的目的在于通过学习这篇文章,了解关于表格数据学习点图神经网络一些基础知识。

qq_41009600的博客 800

常见设计模式的解析和实现(C++)之四-Prototype模式

作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 UML结构图: 抽象基类: 1)Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1)Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象. 解析: Prototype模式其实就是常说的"虚拟构造函数"一个实现,C++的实现机制中并没

Will Mu 的专栏 660

【系统架构设计师】二十三、通信系统架构设计理论与实践①

通信网络主要形式:局域网、广域网、移动通信网。 局域网网络架构有 4 种类型:单核心架构、双核心架构、环型架构、层次型架构。 广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成。通常,在大型网络构建中,通过广域网将分布在各地域的局域网互连起来,形成一个大的网络。 移动通信网为移动互联网提供了强有力的支持,尤其是5G 网络为个人用户、垂直行业等 提供了多样化的服务。

帅次的博客 3764

设计模式——Prototype模式

学习侯捷C++面向对象高级编程中Prototype模式。

m0_56391095的博客 1229

LVGL(lv_canvas)

这篇文章介绍了LVGL图形库中的lv_canvas组件,主要内容包括: lv_canvas是一个绘图缓冲区对象,提供丰富的绘图API,可以理解为LVGL的"离屏画布"。 基本使用流程:创建缓冲区->创建canvas对象->设置缓存和尺寸->进行绘图操作。 详细列举了常用的绘图函数,如绘制线条、矩形、文字、图片等。 提供了示例代码展示如何创建画布并绘制一条红色线段。 介绍了canvas的典型应用场景,如动态波形绘制、自定义控件底图等。 对比了canvas与普通img的区别

m0_49476241的博客 1030

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 861

设计模式之Prototype Pattern

摘自:《设计模式精解—GoF 23种设计模式解析附C++实现源码》 URL: http://www.mscenter.edu.cn/blog/k_eckel Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中我们将通过拷贝构造函数实现之。 1 //Prototype.h 2 #ifndef _PROTO...

weixin_30410999的博客 119

【WRF-UCM】BEP+BEM 模拟:README

【WRF-UCM】BEP+BEM 模拟:README

WW、forever的博客 223

C++ 设计模式 (五) Prototype模式

<br />   作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。<br />   Prototype模式并不是简简单单一个clone方法,Prototype模式的意义在于动态抽取当前对象运行时的状态,同时通过提供统一的clone接口方法,使得客户代码可以在不知道对象具体类型时仍然可以实现对象的拷贝,而无需运用type-switch检测对象的类型信息来分别调用创建方法来创建一个新的拷贝。<br />  Prototype模式结构图:<br />   <br />下面给出一个例子,并不涉

zhuxiufenghust的专栏 693

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++设计模式-Prototype原型模式

作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。 UML图如下: 代码如下: Prototype.h 1 #ifndef _PROTOTYPE_H_ 2 #define

轻锋的专栏 1567

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式:Prototype模式

在软件开发中,有时候可能会需要创建一些特别复杂的对象,如果系统中已经存在同样类型的对象,并且不同的属性个数相差不大的话,用Prototype模式可能是一个理想的选择。 定义:用原型实例指定创建物件的种类,并且通过拷贝这些原型创建新的物件。  Prototype 模式允许一个物件再创建另外一个可定制的物件,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型物件传给那个要发

superbeck的专栏 2366

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

设计模式之Prototype模式

Prototype模式 ​ 根据实例原型,实例模型来生成新的实例 ,通过复制来生成实例 不指定类名的前提下生成实例 根据现有的实例来生成新的实例 clone Cloneable 出场角色 Prototype(原型) 定义用于复制现有实例来生成新实例的方法 ConcretePrototype(具体的原型) 实现复制现有实例并生成新实例的方法 Client(使用者) 使用复制...

PocketKnife 163

设计模式7——Prototype设计模式

Prototype原型设计模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。Prototype原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何关于对象创建的细节。 原型模式的UML图如下: Prototype模式例子如下: //抽象原型类 abstract class Shape implements Colneable{ String

Tony Chen的专栏 1580

GOF设计模式——Prototype模式

一、什么是Prototype模式?         在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例。因为有时候对象种类繁多,无法将它们整合到一个类中;或者,生成实例的过程过于复杂,难以根据类生成实例;又或者,想要将类与框架解耦。这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门...

weixin_39400271的博客 260

23种设计模式(六) —— 手写实现 Prototype 模式 (生成实例)

clone() 方法定义在 java.lang.Object 中,因为 Object 类是所有 java 类的父类。因此所有类都默认继承了 Object 类。小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_85767411的博客 628

[DP]Prototype设计模式

Prototype设计模式 深复制和浅复制 spring中的prototype

HeapStackk的博客 846

[转]笔记--设计模式精解c++-GoF 23 种设计模式解析

转自:http://dxwang.blog.51cto.com/384651/1415880 引言 0.1 设计模式解析(总序)0.2 设计模式解析后记0.3 与作者联系1 创建型模式1.1 Factory模式 1)为了提高内聚(Cohesion)和松耦合(Coupling) ,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。 这样我们可以通过声明一个指向基类的指针来指...

dayao3530的博客 318

Java 设计模式 Prototype 原型 模式

Java 设计模式 Prototype 原型 模式 Prototype 模式用于不能根据类来来生产实例时,而根据现有的实例来生成新的实例。 原型:负责定义用于复制现有实例来生成新实例的方法。 具体的原型:负责实现复制现有实例并生成新实例的方法。 使用者:负责使用复制实例方法生成的实例。 /** * 原型 * @author 托马斯小火车喷雾又喷烟 * */ public interface Product extends Cloneable { public abstract v

5万+

设计模式--Prototype(原型)

Prototype为一种创建型的设计模式。它定义了如何取创建对象。它在实现的时候,代码和factory区别不大。个人认为,所有的代码实现都查不多,就是继承和组合。      通过一个具体的例子可以导出为啥需要prototype的模式。只要不嫌麻烦,factory模式就可以完全满足所有的创建对象需求,但是针对特定的例子里面,factory显得太通用而效率不高。所以才有其他的创建型的模式出来。

book_withc的专栏 724

设计模式(创建型——ProtoType模式)

设计模式四、ProtoType模式4.1 ProtoType模式的概念4.2 ProtoType模式的实现 四、ProtoType模式 4.1 ProtoType模式的概念 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 使用场景 与工厂模式类似,都是用于创建同类对象 不同点 工厂模式需要单独定义一个工厂来创建对象 ProtoType模式将创建对象的过程与类的定义(即原型)耦合在一个类中,且新创建的对象与原型实例的各部分都是相同的 4.2 ProtoType模

qq_37112587的博客 174

设计模式-Prototype模式

一、序言               系列博客文章都是研读Gof的Design Patterns这本书的总结分享,书上的有些例子代码不是很全,这边依葫芦画瓢还原了一些代码,可供运行。目前,网络上很多分享设计模式内容的博客文章,都很经典,其中有个优快云中的设计模式博客专栏也是研究的Gof的书籍,通俗易懂,让读者对设计模式一目了然。 自己在学习设计模式的过程中,有时候理解一个设计模式

天马行空,隐姓埋名 1036
上一篇: 如何在一个已排序的NSArray中搜索某一特定字符串?答案是使用CFArray自带的搜索功能:
下一篇: Cocoa 框架
dadalan
博客等级 码龄20年 428粉丝 770原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值