对象创建模式

通过“对象创建” 模式绕开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. Java Console类

    用于从控制台设备读取字符信息,通常是文本和密码.尤其读取密码字符时是看不见的. 下面给出一个例子: import java.io.Console; /** * @author xusucheng * ...

  2. 编译原理LR分析

    LR(0)分析存在问题及解决办法 当LR(0)含有互相冲突的项目时,则需要向前展 望符号串,检查下一个输入符号的状态 例 项目集I={X→α· bβ,A→α·,B→α· } 当面临输入符号b时,应该选 ...

  3. 【libGDX】使用Mesh绘制三角形

    1 Mesh 和 ShaderProgram 简介 1.1 创建 Mesh ​ 1)Mesh 的构造方法 public Mesh(boolean isStatic, int maxVertices, ...

  4. Android Compose开发

    目录 好处 入门 Composable 布局 其他组件 列表 verticalScroll 延迟列表 内容内边距 性能 修饰符 偏移量 requiredSize 滚动 添加间距Spacer Butto ...

  5. 【Docker】使用 Docker 部署 .Net Core 项目 (四)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  6. 第126篇: 异步函数(async和await)

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记   ES8 的 async/await 旨在解决利用异步结构组织代码的问题. 为为此增加了两个新关键 ...

  7. 【Azure Developer】Github Action使用Azure/login@v1插件登录遇见错误的替代方案

    问题描述 在使用 Github Action  -  Azure/login@v1 的插件时候,登录中国区Azure遇见了问题. Login YAML 内容: - name: 'Login via A ...

  8. 【Azure 事件中心】在Windows系统中使用 kafka-consumer-groups.bat 查看Event Hub中kafka的consumer groups信息

    问题描述 使用 Apache Flink 连接支持 Apache Kafka的Azure Event Hub后,由于消费端的Consumer Group是动态创建,在门户页面和Service Bus ...

  9. Python列表转换成字典、嵌套列表转字典、多个列表转为字典嵌套列表

    目录 两列表转为字典 多列表转为字典嵌套列表 嵌套列表转字典 方法一:直接内置dict 方法二: for循环 一个列表转字典 两列表转为字典 list1=["key1"," ...

  10. Twitter推特 api接口 获取trending趋势搜索关键词 python数据采集

    iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Twitter公开数据采集API,供用户按需调用. 接口使用详情请参考Twitter接口文档 ...