【软件设计师中级】设计模式之原型模式学习笔记(c++)
本文适合新手和小白
目录
1、Prototpye
(1)意图
(2)结构
(3)适用性
2、根据UML类图写代码
(1)泛化关系
(2)关联关系
(3)模式分析
3、代码实现
1、Prototpye
(1)意图
用原型实力制定创建对象的种类,并且通过复制这些原型创建新的对象。
(2)结构
其中:Prototype声明一个复制自身的接口。
CocncretePrototype实现一个复制自身的操作
Client让一个原型复制自身从而创建新的对象
(3)适用性
一个系统要独立于它产品的创建、构成和表示时。//抽象工厂区分: 一个系统要独立与它的产品的创建、组合、表示时
当要实例化的类在运行时刻制定时,通过动态装载。
为了避免创建一个与产品类层次平行的工厂层次时。
当一个类的实例只能有几个不同状态组合中一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化更方便一些。
2、根据UML类图写代码
通过对流程图的观察,我们发现主要有2个关系,1个泛化关系另一个为实现关系。
(1)泛化关系
根据教材366页的解释。泛化是一种特殊/一般的关系,特殊元素(子元素)的对象可替代一般元的对象。用这种方法子元素共享了父元素的结构和行为。本例子中ConcretePrototype和Prototype就是这种关系。
(2)关联关系
根据教材描述,关联是一个中结构关系,她描述了一个组链,链是对象之间的连接。
我们可以将这个关系看做,一个类与另一个类之间有某种关联。它使一个类知道另一个类的属性和方法(实例变量体现)
。A类依赖于B对象,并且把B作为A的一个成员变量
, 则A和B存在关联关系.这种关联关系可以使用HAS-A
表示。关联关系如果进行详细的划分,又可进一步分为单向关联
、双向关联
和自关联
。本例子中Client和Prototype就是这层关系
class Client{public:Client(Prototype *prototype ){this->prototype=prototype;}Prototype *prototype;//关联关系client将Prototype当成员变量使用,让clinet这个类知道Prototype这个类的属性和方法
};
(3)模式分析
通过我们对UML图的解读和分析,原型模式逻辑如下:
1、clinet下有个operation方法,通过关联关系知道 Prototype类下有个clone()方法。(关联关系)
2、Prototype本身是一个抽象类她只提供一个接口,她将clinet类的operation()方法传递出的p交给自己的子类ConcretePrototype1或者ConcretePrototype2中的clone()方法来成完成的。(泛化关系)
3、那么这个ConcretePrototype类中的clone()到底要干什么呢?根据注解(圆圈和横线)描述为 return copy of self(复制自身)。
结论: clinet使用operation方法调用Prototype实现对自身的复制。
3、代码实现
#include<iostream>
using namespace std;class Prototype{//声明一个复制自身的接口public:// Prototype(){}virtual Prototype *clone()=0;virtual void setage(int)=0;virtual void setname(string)=0;virtual void setgender(string)=0;virtual void show()=0;
};class ConcretePrototype:public Prototype{//实现一个复制自身的操作public:ConcretePrototype(){}ConcretePrototype(ConcretePrototype *client){//复制构建,用于克隆this->name=client->name;this->age=client->age;this->gender=client->gender;} ConcretePrototype(int age,string name ,string gender){//初构建this->name=name;this->age=age;this->gender=gender;}void setage(int age){this->age=age;}void setname(string name){this->name=name ;}void setgender(string gender){this->gender=gender; }void show(){cout<<" name: "<<name<<" age: "<<age<<" gender: "<<gender<<endl;cout<<"------------------------------------------"<<endl;}/*ConcretePrototype*/ Prototype *clone(){//返自身实现复制return new ConcretePrototype(this);}~ConcretePrototype(){}private:string name;int age;string gender;
};
class Client{public:Client(Prototype *prototype ){this->prototype=prototype;}Prototype *operation(){return prototype->clone(); }Prototype *prototype;
};
int main(){Prototype *a=new ConcretePrototype(25,"李四","女");//创建原型Client *client=new Client(a);a->show();//打印出李四女士的相关信息Prototype *b=client->operation();//利用client 复制自身创建新对象b->show();//复制后我们通过打印 b显示的依然是李四女士的信息 复制成功b->setage(20);//对复制的对象属性就行一定的修改b->setname("张三");b->setgender("男");b->show();//b显示的信息张三先生的信息a->show();//为了确保修改了b会不会影响到a,通过打印a得到的依然是李四女士的信息,数据安全delete a;delete client;delete b;a=NULL;client=NULL;b=NULL;return 0;
}
输出结果
【软件设计师中级】设计模式之原型模式学习笔记(c++)相关推荐
- 设计模式之建造者模式学习笔记
前言 建造者模式也叫生成器模式,是创建一个复杂对象的创建型模式,将此创建过程和部件解耦,使其构建过程和部件的表示分离开. 解释 建造者模式,说白了就是"攒机".比方说我想要定制一台 ...
- 设计模式之策略模式学习笔记
前言 我想大家都加班写过"业务代码",一大堆的if else,甚至if里面套if-代码不得已变得十分臃肿,对应的维护成本也有所增加.而策略模式,就是为了解决违反了开放封闭原则的这一 ...
- 设计模式之外观模式学习笔记
简介 外观模式,也叫门面模式.隐藏了系统内部的复杂,向客户端提供了一个接口可以访问. 定义 一个子系统的外部和内部通信,必须通过一个统一的对象.该模式提供一个高层接口,使子系统更易使用. 结构图 角色 ...
- 设计模式之代理模式学习笔记
前言 代理模式,也叫做委托模式.就好比请律师打官司一样,为其他对象提供一种代理,来控制对这个对象的访问. 结构图 接下来我们对以上结构图拆解,进行角色分析: 1.Subject:抽象主题类,声明真实主 ...
- 23种设计模式之工厂模式学习笔记
什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...
- 设计模式之模板模式学习笔记
前言 相信大家都写过各种各样的文档,需求文档.设计文档.使用手册等等.为了提高复用性和灵活度,需要采用一系列的模板来应对. 定义 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类不改变一个算法 ...
- 软件设计师中级复习小总结
软件设计师中级复习小总结 计算机与体系结构 K = 1024 k = 1000 B 字节 b 位 1字节 = 8位 8bit(位)=1Byte(字节) 1024Byte(字节)=1KB KB,MB,G ...
- 软件设计师中级 百度知道_设计师应该知道什么
软件设计师中级 百度知道 - and no, it doesn't have to be how to code. --而且,不必一定要编码. Here are a few points that h ...
- 【GOF23设计模式】原型模式
[GOF23设计模式]原型模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口 浅复制 1 pa ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
最新文章
- Struts 学习笔记1 -Struts Framework 概览
- Python——线程1
- ExecutorService框架
- c++对vector中的元素进行随机排序
- InstallShield自定义安装界面
- 使用Git命令时出现fatal: this operation must be run in a work tree提示,该如何解决
- MyBatisPLus入门项目实战各教程目录汇总
- Java反梯形图案_梯形法求定积分(一)设计梯形法求积分的类模板,梯形法
- quartz java 线程 不释放_java Quartz 内存泄漏
- RHEL5安装无线网卡驱动
- winform 属性
- 印度人是怎样开发软件的?
- 使用JMeter进行接口压力测试
- 由于 Exception.tostring()失败,因此无法打印异常字符串
- android 设置锁屏壁纸
- 三十难立,四十有惑:三个代际的产品经理一起聊聊职业体验
- 读一个文本文件总是出现乱码怎么办
- 做一个业务中台你到底会踩多少坑?
- 志当存高远,而唯有努力才能抵达成功彼岸
- google浏览器打开axure原型的插件