当前位置: 首页 > news >正文

Prototype 原型模式

Prototype 原型模式

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

原型模式即在运行时动态的通过一个对象的实例来创建这个类的对象,可以理解成通过一个实例克隆出另一个实例。

Prototype模式的一些优点:

  • 对客户隐藏具体的类,使客户直接可使用与特定应用相关的类。
  • 运行时刻增加和删除产品。
  • 改变值以指定新对象。
  • 改变结构以指定新对象。
  • 减少子类的构造。
  • 用类动态配置应用。

在实现时要考虑一些问题:

  • 使用一个原型管理器。当一个系统中原型的数目不固定时,要保持一个可用原型的注册表。客户在注册表中存储和检索原型。客户在克隆一个原型前会在注册表请求该原型。称这个注册表为原型管理器。
  • 实现克隆操作时要注意深拷贝。
  • 初始化克隆对象时的参数要慎重考虑。

 

 1 #include <iostream>
 2 #include <string>
 3 
 4 class Prototype {
 5 public:
 6     virtual ~Prototype() = 0;
 7     virtual Prototype* Clone() = 0;
 8     virtual void message() = 0;
 9 };
10 Prototype::~Prototype(){}
11 
12 class ConcretePrototype : public Prototype {
13 private:
14     std::string str;
15 public:
16     ConcretePrototype() { str = ""; }
17     ConcretePrototype(std::string s) { str = s; }
18     ConcretePrototype(const ConcretePrototype& r) {
19         std::cout << "拷贝构造" << std::endl;
20         str = r.str;
21     }
22     virtual void message() {
23         std::cout << str << std::endl;
24     }
25     virtual ~ConcretePrototype() {}
26     virtual Prototype* Clone()
27     {
28         std::cout << "克隆操作" << std::endl;
29         return new ConcretePrototype(*this);
30     }
31 };

测试代码

 1 #include <iostream>
 2 #include "Prototype.h"
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     Prototype* p = new ConcretePrototype("秘密");
 9     p->message();
10     Prototype* q = p->Clone();
11     q->message();
12     system("pause");
13 }

测试结果

1 秘密
2 克隆操作
3 拷贝构造
4 秘密
5 请按任意键继续. . .

 

posted on 2014-09-02 16:40 cyendra 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zinthos/p/3951771.html

相关文章:

  • web应用与http协议
  • PDF格式文件如何编辑,怎样修改PDF背景颜色
  • js confirm函数
  • Bootstrap学习:Bootstrap 环境安装
  • Dubbo Mesh 在闲鱼生产环境中的落地实践
  • acl 之 xml 流解析器
  • Linaria 1.0正式发布:一个零运行时CSS-in-JS库
  • 从后端到前端的转变:如何选择框架?
  • Pascal's Triangle LeetCode
  • php常用字符串函数
  • ORACLE--分区表数据清理
  • 那些到了 30 岁的技术人,后来都去哪了?
  • 重装操作系统-mysql数据库还原
  • elasticsearch使用指南之Elasticsearch Document Update API详解、原理与示例
  • 链表 其他操作
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • const let
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • es的写入过程
  • JavaScript中的对象个人分享
  • Just for fun——迅速写完快速排序
  • Median of Two Sorted Arrays
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • sessionStorage和localStorage
  • SwizzleMethod 黑魔法
  • 包装类对象
  • 从setTimeout-setInterval看JS线程
  • 分布式熔断降级平台aegis
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 警报:线上事故之CountDownLatch的威力
  • 那些年我们用过的显示性能指标
  • 强力优化Rancher k8s中国区的使用体验
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #1014 : Trie树
  • #etcd#安装时出错
  • (03)光刻——半导体电路的绘制
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (function(){})()的分步解析
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)项目管理杂谈-我所期望的新人
  • 、写入Shellcode到注册表上线
  • .describe() python_Python-Win32com-Excel
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 读取 JSON格式的数据
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票