对象创建模式

通过“对象创建” 模式绕开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. python课本学习第六章

    一.字典的概念 #示例代码 student = {'name':'xx','name':'yy','grade1':98.1,'grade':99.2} print(student) #output: ...

  2. std::weak_ptr 与 std::shared_ptr 配合使用

    std::shared_ptr<int> a = std::make_shared<int>(2); std::weak_ptr<int> b = a; a = n ...

  3. Docker方式快速启动一个Redis实例

    安装Redis有多种方式,除了可以通过各个平台的软件包工具安装外,还可以直接从源码安装. 但是,安装Redis可能会遇到一些这样的问题,比如: 1.网络环境比较差,下载耗时比较长 2.从源码编译安装时 ...

  4. python枚举之Enum模块

    枚举是与多个唯一常量值绑定的一组符号(即成员).枚举中的成员可以进行身份比较,并且枚举自身也可迭代. 枚举成员名称建议使用大写字母 # 示例 from enum import Enum,unique, ...

  5. VMware虚拟机Ubuntu系统如何占满整个屏幕

    VMware虚拟机Ubuntu系统分辨率调节 桌面右击--Disoplay Settings 选择一个跟本机系统一样或者相近的.(本机小米笔记本win11,具体看自己的情况) 结束.

  6. 在Bind DNS Server中添加一个开发环境的域名

    1.Create Master Zone 我们的开发域名约定为dudusoft.cn 输入2个字段,然后提交 2.在域名里面,添加主机记录 点击上图的"Address(0)",出现 ...

  7. Spring-Cloud集成redis-cluster

    前言 系统之前接入的是单点redis,为了条系统高可用能力,特增加集成redis-cluster集群的步骤 依赖库引入 <dependency> <groupId>org.sp ...

  8. 【Azure Key Vault】Key Vault能不能生成DigiCert证书?能不能自动 Rotate 证书呢?

    问题描述 因为Azure Key Vault服务上保管的证书可以轻松的与其他Azure服务集成使用,所以需要知道 Key Vault 能不能生成 DigiCert 证书?能不能自动 Rotate 证书 ...

  9. 【Azure 应用服务】App Service 部署txt静态文件和Jar包在不同目录中的解决办法

    问题描述 在Web App wwwroot (Windows系统中)根目录下如何部署一个jar包和一个text文件,让两个文件都能被访问? 解决办法 Jar包和Text文件都分别放置在两个单独的文件夹 ...

  10. c++复习笔记——STL(vector)

    c++-----STL容器系列(1) vector 1 介绍 Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vecto ...