对象创建模式

通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。

典型模式

Prototype

动机

  • 在软件系统中,经常面临着“某些结构复杂的对象’的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。
  • 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?

定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

结构

总结

  • Prototype模式同样用于隔离类对象的使用者和具体类型( 易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
  • Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆’的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象一-所需 工作仅仅是注册一个新类的对象(即原型) ,然后在任何需要的地方Clone。
  • Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。

cpp

#include<iostream>

//原型类
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {}
virtual ISplitter* clone() = 0; //通过克隆自己来创建对象
}; //具体类
class BinarySplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "BinarySplitter" << std::endl;
}
virtual ISplitter* clone() override {
return new BinarySplitter(*this);
}
}; class TxtSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "TxtSplitter" << std::endl;
}
virtual ISplitter* clone() override {
return new TxtSplitter(*this);
}
}; class PictureSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "PictureSplitter" << std::endl;
}
virtual ISplitter* clone() override {
return new PictureSplitter(*this);
}
}; class VideoSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "VideoSplitter" << std::endl;
}
virtual ISplitter* clone() override {
return new VideoSplitter(*this);
}
}; class Form
{
//...
}; class MainForm :public Form
{
public:
MainForm(ISplitter* prototype)
{
this->prototype = prototype;
}
void Button_Click()
{
ISplitter* splitter = prototype->clone(); //克隆原型
splitter->split();
}
//...
private:
//...
ISplitter* prototype; //原型对象
}; int main()
{
ISplitter* Binary = new BinarySplitter();
MainForm* formBinary = new MainForm(Binary);
formBinary->Button_Click(); return 0;
}

C++设计模式 - 原型模式(Prototype)的更多相关文章

  1. PHP设计模式 原型模式(Prototype)

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

  2. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  3. C#设计模式——原型模式(Prototype Pattern)

    一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...

  4. 设计模式-原型模式(Prototype)

    场景分析: 前面我们提到,交易对象Trade,还有继承他的债券交易BondTrade.期货交易FutureTrade. 现在有一个需求,需要提供方法将交易拆分成多笔小交易. 代码如下(如果没有clon ...

  5. 设计模式——原型模式(Prototype Pattern)

    原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...

  6. 大话设计模式--原型模式 Prototype -- C++实现

    1. 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象... 注意: 拷贝的时候是浅拷贝 还是 深拷贝, 来考虑是否需要重写拷贝构造函数. 关键在于: virtual Pro ...

  7. 设计模式——原型模式(Prototype)

    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.——DP UML类图 模式说明 如果把在一张纸上手写一篇简历的过程看成是类的实例化过程,那么通过原型模式创建对象的过程就是拿着这张纸到复印 ...

  8. 设计模式--原型模式Prototype(创建型)

    一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...

  9. 谈谈设计模式~原型模式(Prototype)

    返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式 ...

  10. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

随机推荐

  1. 我又踩坑了!如何为HttpClient请求设置Content-Type?

    1. 坑位 最近在重构认证代码,认证过程相当常规: POST /open-api/v1/user-info?client_id&timstamp&rd=12345&sign=* ...

  2. 腾讯云轻量级主机修改hostname后重启后又恢复原先的hostname

    搭建k8s后,执行inspect后 显示hostname 不符合规范, 修改/etc/hostname 后重启, 发现又自动恢复到默认主机名: 查资料后发现腾讯云的配置里,如果重启会重置hostnam ...

  3. Windows系统下的输入法选择

    总共用过5款输入法:搜狗拼音输入法,QQ拼音输入法,谷歌拼音输入法,手心输入法,小狼毫. 搜狗输入法功能最强大,词库也很全,基本上对于盲打的输入纠错很准确,但是因为后台会启动多个服务,会占很多内存资源 ...

  4. CXP协议的传输层介绍 8b/10b编码

    8b/10b编码与K码 upconnection 和downconnection均使用8b/10b编码,因此我们先简单回顾一下8b/10b吧 8B/10B编码被广泛应用到高速串行总线,如IEEE139 ...

  5. 【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error

    问题描述 App Service上部署的Java应用,连接 Azure Database for MySQL 失败.错误信息:Create connection error, url: jdbc:my ...

  6. magic book

    magic book.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFo ...

  7. 如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

    图计算业务背景介绍 我们为什么选择 NebulaGraph? 在公司各个业务线中,有不少部门都有着关系分析等图探索场景,随着业务发展,相关的需求越来越多.大量需求使用多模数据库来实现,开发成本和管理成 ...

  8. Nebula Graph 源码解读系列|客户端的通信秘密——fbthrift

    概述 Nebula Clients 给用户提供了多种编程语言的 API 用于和 Nebula Graph 交互,并且对服务端返回的数据结构进行了重新封装,便于用户使用. 目前 Nebula Clien ...

  9. Advanced .Net Debugging 3:基本调试任务(上)

    一.简介 这是我的<Advanced .Net Debugging>这个系列的第三篇文章.这个系列的每篇文章写的周期都要很长,因为每篇文章都是原书的一章内容(太长的就会分开写).再者说,原 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (208)-- 算法导论15.4 5题

    五.设计一个 O($n^2$) 时间的算法,求一个 n 个数的序列的最长单调递增子序列.要写代码的时候,请用go语言. 文心一言,抛panic: 在 Go 语言中设计一个 O(n^2) 时间复杂度的算 ...