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

主要解决:在运行期建立和删除原型。

何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。

如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

使用场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。 4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。 6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

 

浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。

深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

#include<iostream>
#include<string> //WorkExperience类
class WorkExprerience{
private:
std::string workDate;
std::string company;
public:
WorkExprerience(){}
~WorkExprerience(){} WorkExprerience(WorkExprerience* work){
this->workDate = work->workDate;
this->company = work->company;
}
std::string getWorkDate(){
return workDate;
}
void setWorkDate(std::string workDate){
this->workDate = workDate;
}
std::string getCompany(){
return company;
}
void setCompany(std::string company){
this->company = company;
} //clone
WorkExprerience* Clone(){
return new WorkExprerience(this);
}
}; //原型类,声明一个克隆自身的接口。
class Prototype{
protected:
std::string name;
std::string sex;
std::string age;
std::string timeArea;
std::string company;
public:
virtual void SetPersonalInfo(std::string sex, std::string age) = ;
virtual void Display() = ;
virtual Prototype* Clone() = ;
}; //具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作
class Resume :public Prototype{
private:
WorkExprerience * workExp;
public:
Resume(std::string name){
this->name = name;
workExp = new WorkExprerience();
}
~Resume(){
if (workExp != NULL)
delete workExp;
}
//克隆需要的构造函数
Resume(WorkExprerience* workExp){
this->workExp = workExp->Clone();
}
void SetPersonalInfo(std::string sex, std::string age){
this->sex = sex;
this->age = age;
}
void SetWorkExperience(std::string company,std::string workDate){
workExp->setCompany(company);
workExp->setWorkDate(workDate);
}
void Display(){
std::cout << name << " " << age<<" "<<sex << " " << std::endl;
std::cout << "工作经历 " << workExp->getWorkDate() << " " << workExp->getCompany() << std::endl;
}
Resume* Clone(){
Resume* clonedResume = new Resume(workExp);
clonedResume->name = this->name;
clonedResume->sex = this->sex;
return clonedResume;
}
}; void main(){
Resume* a = new Resume("big bird");
a->SetPersonalInfo("MAN", "");
a->SetWorkExperience("1998-2000", "baidu"); Resume* b = a->Clone();
b->SetWorkExperience("2000-2008", "google"); Resume* c = a->Clone();
c->SetPersonalInfo("MAN", "");
c->SetWorkExperience("2000-2008", "apple"); a->Display();
b->Display();
c->Display();
system("pause");
}

参考:

https://blog.csdn.net/xiqingnian/article/details/41983337

http://www.runoob.com/design-pattern/prototype-pattern.html

《大话设计模式》c++实现 原型模式的更多相关文章

  1. 大话设计模式Python实现-原型模式

    原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/env python # -*- c ...

  2. C#《大话设计模式》之原型模式学习日记

    class Program { static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPerson ...

  3. java23种设计模式——四、原型模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

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

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

  5. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  6. 大话设计模式C++版——代理模式

    本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...

  7. 大话设计模式C++版——工厂模式在COM中的典型应用

    上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...

  8. 设计模式学习心得<原型模式 Prototype >

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...

  9. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  10. 大话设计模式Python实现-迭代器模式

    迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示. 下面是一个迭代器模式的demo: #!/usr/bin/env python # - ...

随机推荐

  1. ubuntu物理机上搭建Kubernetes集群 -- minion 配置

    1. flannel配置 下载二进制文件 https://github.com/coreos/flannel/releases 版本:flannel-v0.7.0-linux-amd64.tar.gz ...

  2. 《Redis 持久化》

    一:什么是持久化?    - Redis 是内存级别的数据库.所谓持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)中. - 可以持久读取操作等的数据. - Redis 支持 R ...

  3. Win10系统桌面右键新建没有内容怎么恢复

    Win10系统桌面右键新建没有内容怎么恢复 添加txt文本文档 运行->regedit,打开注册表编辑器 展开HKEY_CLASSES_ROOT 找到.txt 选中.txt,修改右侧窗格的“默认 ...

  4. java JDBC (一)

    package cn.sasa.demo1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re ...

  5. tr 命令

    [root@localhost .txt abcdefg [root@localhost .txt |tr [a-z] [A-Z] ABCDEFG // 把文件小写字母变成大写字母

  6. OSError:[Errno 13] Permission denied:'my_library' 问题解决方法

    出现问题: 执行 rosrun rosserial_windows make_libraries.py my_library 命令时出现OSError:[Errno 13] Permission de ...

  7. 20190223 Hadoop生态圈,关于大数据

    周六参加了一场,大数据基础培训,讲得比较详细.培训的讲师对于互联网行业职位萎缩也有相对的解释,也还介绍了新的职位的诞生. 以前对于大数据的理解,就是超大的数据量,但对大数据开发不甚了解. 大数据平台的 ...

  8. 谷歌浏览器安装octotree插件

    Octotree Chrome安装与使用方法 Octotree Chrome作用: 主要使你在github查看项目时可以清晰明了的看到项目的结构以及具体代码,使下载代码更具有目的性,减少不必要代码的下 ...

  9. pip升级时报错--- No module named 'pip._internal'

           一.问题:        之前python3.6是安装的pip版本为:pip=9.0.1,我按照提示升级报错,一直装不上pip18.0,于是直接在site-package目录下删掉了pi ...

  10. wx:Textctrl

    import wx class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(pare ...