创建型模式之Prototype
1、意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建对象。
2、适用性
当一个系统应用独立于它的产品创建、构成和表示时,要使用Prototype模式
(1)当要实例化的类是在运行时刻指定时
(2)为了避免创建一个与产品类层次平行的工厂类层次时
(3)当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
3、结构
5、参与者
Prototype:声明一个克隆自身的接口
ConcretePrototype:实现克隆自身的操作
Client:让一个原型克隆自身从而创建一个对象
6、效果
优点
(1)运行时刻增加和删除产品
(2)改变值以指定新对象
(3)改变结构以指定新对象
(4)减少子类的创建
缺点:每一个Prototype的子类都必须实现clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。
7、相关模式
Prototype和Abstract Factory模式在某种方面是相互竞争的。但是它们也可以一起使用。Abstract Factory可以存储一个被克隆的原型的集合,并且返回产品对象。
大量使用Composite和Decorator模式的设计通常也可从Prototype模式处获益。
C++代码如下
#include <iostream>
#include <string>
#include <memory>using namespace std;class Prototype
{
public:virtual unique_ptr<Prototype> clone() = 0;
};class ConcretePrototype1 : public Prototype
{string name;public:ConcretePrototype1(const ConcretePrototype1 &t) { *this = t;};ConcretePrototype1& operator = (const ConcretePrototype1 &t){name = t.name;return *this;}ConcretePrototype1(const string &s) : name(s) {}void setName(const string &s) {name = s;};string getName() {return name;}unique_ptr<Prototype> clone(){unique_ptr<Prototype> copy(new ConcretePrototype1(*this));return copy;}
};class ConcretePrototype2 : public Prototype
{int value;
public:ConcretePrototype2(const int &v) : value(v) {}void setValue(int v) {value = v;}int getValue() {return value;}unique_ptr<Prototype> clone(){unique_ptr<Prototype> copy(new ConcretePrototype2(*this));return copy;}
};int main()
{ConcretePrototype1 a("prototype design pattern");ConcretePrototype2 b(7);unique_ptr<Prototype> aCpy = a.clone();unique_ptr<Prototype> bCpy = b.clone();ConcretePrototype1 *pa = dynamic_cast<ConcretePrototype1*>(aCpy.get());ConcretePrototype2 *pb = dynamic_cast<ConcretePrototype2*>(bCpy.get());pa->setName("abc");pb->setValue(111);cout << pa->getName() << endl;cout << pb->getValue() << endl;return 0;
}
创建型模式之Prototype相关推荐
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 设计模式之原型法(ProtoType)----对象创建型模式
设计模式之原型法(ProtoType)----对象创建型模式 1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用性 1)当要实例化的类是在运行时刻指定时,例如,通过动 ...
- 【设计模式】三大类:创建型模式、结构型模式、行为型模式
1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...
- Java设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- 设计模式之创建型模式
2019独角兽企业重金招聘Python工程师标准>>> 随着对软件工程研究的不断深入,设计模式也越来越多了,根据其目的准则,划分如下: 1. 创建型:creational 与对象的创 ...
- 设计模式——创建型模式
创建型模式抽象了实例化过程,他们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,一个对象创建模式将实例化委托给另一个对象. 1. Factory Meth ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- 设计模式6——创建型模式之原型模式
定义:原型模式(Prototype Pattern),用原型模式指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 类型:创建型模式. 类图: 参与角色: CPrototype,抽象原型基类,提供 ...
- Java学习--设计模式之创建型模式
一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...
最新文章
- dubbo学习之dubbo管理控制台装配及集成zookeeper集群部署(1)【转】
- 随着浏览器滚动,页面组件跟着滚动的效果
- 判断字符串 正则_(重学前端 - JavaScript(模块一)) 14、引用类型之 RegExp (正则)(详述)...
- linux 下mysql安装配置管理以及优化
- 计算机网络(一)计算机网络体系
- idea 用iterm 终端_iTerm2 都不会用,还敢自称老司机?(上)
- Java LinkedList addFirst()方法与示例
- mysql设置user权限允许远程_mysql 用户及权限管理 允许远程连接
- MVC4网站发布到windows server 2003服务器
- Ubuntu系统搭建以太坊开发平台过程
- C语言指针函数和函数指针区别
- java生成三位随机数_java工具类(三)之生成若干位随机数
- CRM实战分类以及对企业运营的思考
- 小米MiSans字体安装教程
- 浅析网吧电影服务器配置与搭建(转)
- sun.misc.BASE64Encoder是内部专用 API, 可能会在未来发行版中删除
- 5.11 按照文字的笔划进行数据的排序 [原创Excel教程]
- meta标签(以京东首页为例)
- tmooccn达内登录_达内上线技术学习平台TMOOC.CN,由线下反攻线上,O2O是在线教育的出路?...
- simulink/stateflow 纯电动+4档变速箱动力性经济性仿真模型 包含vcu控制及换档控制模型,可实现最高车速 最大爬坡度 加速时间
热门文章
- 阚凯力:四核终端发展需软硬件相互促进
- Cocos2d-x win7 + vs2010 配置图文详解(亲测)
- 从官网下载的python包如何使用-如何使用Python从需要登录信息的网站下载文件?...
- 下列关于python的描述正确的是-以下关于Python中模块的说法正确的是(_____)。...
- python爬虫原理-爬虫原理解析
- python画树叶-如何理解python一行代码实现一个爱心字符画?
- python散点图拟合曲线-python散点图:如何添加拟合线并显示拟合方程与R方?
- 2018python培训-Python学习之路—2018/7/2
- python好学嘛-爬虫Python入门好学吗?学什么?
- python代码壁纸-一个爬取壁纸的python代码