原型设计

设计模式:原型模式(C++)【克隆羊多莉】

别来无恙 提交于 2019-11-27 23:35:43
原型模式介绍 这节我们继续学习设计模式——原型模式。我们先看看原型模式的标准说法, 用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象 。 其实原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节而已 。 我们 先看看C++和其他一些面向对象的编程语言的区别 。 在java、C# 或者一些其他的面向对象编程语言,他们所有的类都是都会继承或者间接继承Object类 。比如说java中Object类 有一个clone方法,实现上就是原型模式的体现,子类需要根据情况进行实现罢了。而 我们的C++呢 没有Object(上帝类),所以呢 我们需要在我们自己的原型类中添加一个clone 克隆方法就行了 。有人或许会说, C++不是有拷贝构造函数么。确实有默认的拷贝构造函数呀,但是 默认的拷贝构造函数只提供基本的值拷贝 ,如果有在堆区开辟空间的成员呢? 所以我们要提供自己的拷贝构造函数进行深拷贝,方便用户,还应该提供一个clone方法(实际就是去调用拷贝构造函数) 。下面看 原型模式克隆羊多莉 案例 。 克隆羊多利代码实现 原型图就是不画了吧,就一个类。。。。 对外提供clone方法,如果类成员有在堆区开辟空间,需要重新拷贝构造函数进行深拷贝!clone方法本质还是调用拷贝构造函数 。注意,我们的 析构函数要释放堆区开辟的内容 哟。 #define _CRT

设计模式-原型模式

北城余情 提交于 2019-11-27 23:35:18
原型模式 原型模式是23种设计模式之一,和单例模式一样,相对其他设计模式较为容易理解。 定义 原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。[1] 原型模式通过克隆一个已经存在的对象实例来返回新的实例,而不是通过new去创建对象,多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效。在Java中,复制对象是通过原型对象实现 Cloneable接口 ,重写 clone()方法 实现的 在实际开发中我们也经常使用克隆方法,下面是我在工作中遇到的案例,业务非常的简单 业务需求: 要求对数据的update,modify,delete的操作,都需要备份原始数据,提高业务的容错性 解决方案: 操作数据前先根据主键或唯一字段查出数据,再用BeanUtils.copyProperties(source, target)方法克隆出一个新的类 注:这里我们调用了BeanUtils中的copyProperties(source, target)方法来进行数据的复制。当然你也可以使用原始的get和set的方法进行数据的复制,但是当类中的字段相当庞大时,原始的办法就显得相当的繁琐。

设计模式之原型模式总结

寵の児 提交于 2019-11-27 23:34:08
术语快速解释 其实原型模式说白了就是克隆,用于创建重复的对象,同时又能保证 性能 。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。 为什么能保证性能? 是因为,原型模式是在内存中的二进制流的拷贝要比直接new好,特别是要在一个很大的循环体中产生大量对象的时候,你觉得是直接复制好,还是执行一次循环再获取一次要来的快?答案显而易见。但是它也有一个显著的缺点,那就是既然是直接在内存中拷贝,那么就根本 不会执行构造函数 ,因为构造函数是用来初始化类的,而你是直接拷贝。所以需要注意这点 原型模式使用方式 克隆有两种方式浅克隆,和深克隆,当然这里介绍原型模式用到简单的深克隆。具体两者区别及高级用法用法请 移步 ,不是这里介绍的重点 实现步骤: 被复制的类需要实现Clonenable接口, 该接口为标记接口(不含任何方法) 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。 将得到的复制对象返回,如果对象中有引用对象那么对引用对象再克隆一次。 class Student implements Cloneable{ private int number; private ArrayList<String> image = new ArrayList

设计模式(十六)原型模式

眉间皱痕 提交于 2019-11-27 23:33:55
相关文章 设计模式系列 前言 公众号有同学留言设计模式,才发现好久没有写设计模式了。关于创建型设计模式只差原型模式没写了,这一篇就来填补这个空缺。 1.原型模式定义 原型模式定义 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 原型模式UML图 在原型模式中有如下角色: Client:客户端角色。 Prototype:抽象原型角色,抽象类或者接口,用来声明clone方法。 ConcretePrototype:具体的原型类,是客户端角色使用的对象,即被复制的对象。 需要注意的是,Prototype通常是不用自己定义的,因为拷贝这个操作十分常用,Java中就提供了Cloneable接口来支持拷贝操作,它就是原型模式中的Prototype。当然,原型模式也未必非得去实现Cloneable接口,也有其他的实现方式。 2.原型模式简单实现 原型模式的核心是clone方法,通过该方法进行拷贝,这里举一个名片拷贝的例子。 现在已经流行电子名片了,只要扫一下就可以将名片拷贝到自己的名片库中, 我们先实现名片类。 具体的原型类 public class BusinessCard implements Cloneable { private String name; private String company; public BusinessCard (){ System

设计模式——原型模式

非 Y 不嫁゛ 提交于 2019-11-27 23:33:41
概述: 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。如果需要短时间创建大量对象,并且new的过程比较耗时。则可以考虑使用原型模式! 优势 :效率高(直接克隆,避免了重新执行构造过程步骤) 两种方式 : 使用实现Cloneable接口的方式实现浅克隆 使用序列化和反序列化的方式实现深克隆 例子 :实现一个类的克隆 克隆羊类: import java.io.Serializable; import java.util.Date; // 克隆羊 public class Sheep implements Cloneable,Serializable { private String name; private Date birthday; public Sheep() {} public Sheep(String name, Date birthday) { super(); this.name = name; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; }

五。设计模式(原型模式)

强颜欢笑 提交于 2019-11-27 23:33:25
概念: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 1.浅复制,引用对象不进行复制。 使用环境: 1.当要实例化的类是在运行时刻指定时,例如:通过动态装载, 2.为了避免创建与产品类层次平行的工厂类层次时。 3.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工 实例化该类更方便一些。 原型模式的构成: 1.抽象的原型类(prototype):定义具有克隆自己方法的接口。 2.具体原型类(ConcretePrototype):实现具体的克隆方法。 3.客户类(Client):通过克隆生成一个新的对象。 具体代码如下: 客户端类代码: ****************************************************************** #include <QCoreApplication> #include "concreteprototype.h" #include <QDebug> int main( int argc, char *argv[]) { QCoreApplication a(argc, argv); concreteprototype *type1 = new concreteprototype ( "1" ); concreteprototype

设计模式之原型模式

匆匆过客 提交于 2019-11-27 23:33:05
一、定义 通过原型实例指定创建对象的种类,并通过拷贝这些原型实例构建新的对象。(我觉简单的说,就是一种更快更省资源的创建新的 对象的方法) 二、实例 定义什么的总是难懂,还是上实例吧! 定义一个Ball类型,实现Cloneable接口,使得这个类的对象能够被克隆。 public class Ball implements Cloneable { public int id = - 1 ; public String teststring ; public int [] num ; public ArrayList<String> list = new ArrayList<String>(); public T t ; @Override protected Object clone () throws CloneNotSupportedException { Ball ball = null ; try { ball = (Ball) super .clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return ball ; } } //T类型 class T{ public int t = 0 ; } 测试代码如下: Ball ball = new Ball(); ball.setId

软件设计项目进展01 2019/8/19

老子叫甜甜 提交于 2019-11-27 22:02:15
1.当天完成的工作: 在软件课程设计的第一天,仔细了解了软件开发实践课程的整体流程,为接下来一个月将要完成的事情搭起了整体框架。 主要完成了如下事情:1)组队:组名:fubuki 成员: 丁悦(我,组长),张玲瑀(组员),张楠(组员)。 2)选题完成:基于微信小程序的食堂订餐送餐系统设计与实现。 项目名称:懒人食堂 2.第二天的计划: 1)下载墨刀原型设计工具,仔细了解其功能和操作。 2)结合墨刀原型设计工具对微信小程序的需求功能进行合理的设计。 3.每日小结: 今天对一个软件开发的过程有了初步的认识,软件开发是一个并不容易的过程,需要较强的综合能力。然后经过考虑确认了项目的选择。相信自己经过一个月的坚持,学习与实践,能力将会有大的提升。 来源: https://www.cnblogs.com/dydy9999/p/11379184.html

组建fubuki队

≡放荡痞女 提交于 2019-11-27 22:02:00
摘要:项目开展的第一天,我和另外的两名队员丁悦和张玲瑀组成了fubuki队来共同完成这次的软件课程设计任务。 我们选择的项目是基于微信小程序的食堂订餐送餐系统的设计与实现。项目名字为“懒人食堂” 第二日的计划:明天开始着手学习墨刀的使用,先用墨刀设计这一小程序的原型,再利用现有的模板再加上自己的创新进一步分析设计出小程序具体要实现的功能。 来源: https://www.cnblogs.com/sakanao/p/11379649.html

Spring 核心技术(6)

删除回忆录丶 提交于 2019-11-27 20:58:48
接上篇: Spring 核心技术(5) version 5.1.8.RELEASE 1.5 Bean 作用域 创建 bean 定义时,你创建了一种用于创建 bean 定义中定义的类实例的方法。bean定义的设想是一个很重要的方法,因为它意味着,与一个类一样,你可以从以一种方式创建许多对象实例。 你不仅可以控制要插入到以特定 bean 定义创建的对象中的各种依赖项和配置值,还可以控制以特定bean定义创建的对象的作用域。这种方法功能强大且灵活,因为你可以选择通过配置创建的对象的作用域,而不必在 Java 类级别设定对象的作用域。Bean 可以被部署到定义的多个作用域之一中。Spring Framework 支持六个作用域,其中四个范围仅在使用支持 Web 的 ApplicationContext 时可用。你还可以创建 自定义范围 。 下表描述了支持的作用域: 作用域 描述 单例 (默认)将单个 bean 定义的作用域限定为每个 Spring IoC 容器的单个对象实例。 原型 将单个 bean 定义作用域限定为任意数量的对象实例。 请求 将单个 bean 定义作用域限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,它是在单例 bean 定义的后面创建的。仅在支持 web 的 Spring ApplicationContext 中可用。