原型模式

【设计模式】原型模式

瘦欲@ 提交于 2020-01-12 17:13:27
原型模式 原型模式 ,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 说白点就是,使用原型模式可以很便捷的创建一个原型出来,之后再拷贝它,并可以对拷贝出来的东西进行修改。 原型模式原本的意思是, 先构造原型,再拷贝(也就是不用构造),从而说原型模式提高了效率。 但写完代码后发现,如果要实现深拷贝,也就是所有的指针、引用的部分都需要使用new才能完成。new也就是构造对象,当然这个构造对象只是构造整个对象里的指针、引用部分,所以我认为效率的提高程度依赖于类里引用类型的数目。 讲真的,或许这个模式并不适合C++,因为C++里面有个拷贝构造,可以直接拷贝。并且再Java和C#语言中都用对应的类似于ICloneable接口。 注:我也不知道这个模式使用的频率多不多,如果使用Java或C#,我觉得我可能需要重新学习一下,但原理再上述讲清了。 来源: https://www.cnblogs.com/LampsAsarum/p/12183093.html

08-原型模式

元气小坏坏 提交于 2020-01-11 05:33:39
原型模式 一、定义 用原型实例指定创建的对象,并且通过拷贝这些原型创建新的对象。 原型模型的核心是一个clone方法,通过这个方法进行对象的拷贝 原型模式的通用类图 原型模式通用源码 public class PrototypeClass implements Cloneable { //覆写父类Object方法 @Override public PrototypeClass clone ( ) { PrototypeClass prototypeClass = null ; try { prototypeClass = ( PrototypeClass ) super . clone ( ) ; } catch ( CloneNotSupportedException e ) { //异常处理 } return prototypeClass ; } } 二、原型模式的优点 性能优良 原型模式是在内存二进制流的拷贝,要比直接new一个对象性能要好很多,特多要在一个循环体内产生大量对象是 逃避构造函数的约束 这既是它的优点也是它的缺点,直接在内存中拷贝,构造函数是不会执行的。 三、原型模式的使用场景 资源优化场景 类初始化需要消耗非常多的资源(数据,硬件等资源) 性能和安全要求的场景 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

设计模式@第7章:原型模式

浪尽此生 提交于 2020-01-10 22:49:58
第7章:原型模式 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10 只羊。 二、传统方式解决克隆羊问题 思路分析(图解) 看老师代码的演示 首先是 Sheep 实体类 package com.gjxaiou.prototype; public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getColor() { return color; } public void setColor

设计模式之——原型模式(克隆模式)

浪子不回头ぞ 提交于 2020-01-08 20:45:32
一、基本介绍 原型模式(创建型):用一个已经创建好的对象作为原型,通过复制该原型对象创建出相同或相似的对象。 二、包含角色 1.抽象原型类:规定了具体原型对象必须实现的接口。 2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 三、案例及UML类图 案例说明: 当做试卷的时候,我们需要抄别人的试卷,则需要复制对原来的试卷进行复制操作。 UML类图: 方式一:浅克隆 类TestPaper1: public class TestPaper1 implements Cloneable{ private String name; private int clazz; private String content; private Integer rank; private Date date; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getClazz() { return clazz; } public void setClazz(int clazz) { this.clazz = clazz; } public String getContent() { return content; }

GOF 23设计模式之(创建型模式)

倖福魔咒の 提交于 2020-01-06 21:52:25
目录 1.单例模式 1.1饿汉模式 1.2懒汉模式 1.3其他单例模式 2.原型模式 2.1 浅克隆 2.2深克隆 3.工厂模式 3.1简单工厂模式 3.2工厂方法 4.抽象工厂模式 5.建造者模式 一、单例模式(Singleton)   保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。   优点:由于只生成一个实例,减少了系统性能开销。可以在系统中设置全局的访问点,优化环境共享资源访问。如:可以设置一个单例类,负责所有数据表的映射处理。   常见的单例模式:     饿汉模式(线程安全,调用效率高,不能延迟加载)(主要)     懒汉模式(线程安全,调用效率不高,可以延迟加载)(主要)     双重检测锁(由于JVM底层内部模型原因,偶尔会出现问题,不推荐使用)     静态内部类式(线程安全,调用效率高,可以延迟加载)     枚举单例(线程安全,调用效率高,不能延迟加载)   单例模式UML图:       (1) 饿汉模式     问题:如果只是加载本类、不调用本类的getInstance()方法,或永远不调用本类。就会造成资源的浪费。 class eh{ //(1)直接创建私有实例对象 private static final eh texteh = new eh(); //(2)私有无参的构造函数 private eh() {} //(3

设计模式之创建型模式---原型模式模式

孤街浪徒 提交于 2019-12-31 22:52:53
原型模式(Prototype) 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 原型模式主要涉及两个概念,浅拷贝与深拷贝。 浅拷贝 :是指将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。 深拷贝 :是指将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。 说完理论,接着来举例: 首先先创建一个非基本类型的对象( 为了能够实现深拷贝,此处创建的对象必须序列化 ): /** * @author chenglezheng */ public class Clone implements Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 接着我们创建一个浅拷贝对象 /** * @author chenglezheng */ public class CloneShallow implements Cloneable{ private Clone clone; private int test; public int getTest(

Python设计模式:原型模式

余生颓废 提交于 2019-12-29 14:36:23
设计模式四:原型模式 什么是原型模式 创建某个时间点对原有对象的一个完全副本。 使用场景 重新创建原有对象没有意义时, 一个对象过于复杂不适合重新创建时, 希望对对象的某些部分变更但又希望保持原有对象不变时, 此时可以使用原型模式。 典型案例 复制一张图片,在复制出的图片上做修改,这样不会影响原图片,也可以得要修改后的图片。 实例代码 #原型模式必备 import copy from collections import OrderedDict class Manual : def __init__ ( self , name , authors , date , ** arg ) : self . name = name self . authors = authors self . date = date self . __dict__ . update ( arg ) def __str__ ( self ) : lists = [ ] ordered = OrderedDict ( sorted ( self . __dict__ . items ( ) ) ) for index in ordered . keys ( ) : lists . append ( '{} : {}' . format ( index , ordered [ index ] ) ) lists

原型模式

心不动则不痛 提交于 2019-12-26 15:46:10
原型模式 参照了许多大佬的博客,这里先给出自己一些关于原型模式的理解,从名字本身来讲,原型就是一个model,就像前人造的轮子的蓝图,你依葫芦画瓢再克隆出来一个不就行了,思想还是很简单的,关键在于它的实现 Shallow Copy 从话里听出来实现的核心就是克隆,那么就来谈谈克隆的道道,众所周知,在猿类的思想中有深拷贝和浅拷贝的操作,所谓浅拷贝就是复制对象的内容,对象中的引用、容器、数组这些复杂类型是copy他们的地址、而修改浅拷贝后的对象的基本类型或包装类型的值和原来的对象没有关系,但修改复杂类型就会跟原对象牵连了 Deep Copy 深拷贝其实就是复制一个完全不同的对象,这样强调其区别其实不为过,主要在于复杂类型的地址问题,但这两种克隆方式都是创建出了不同的对象,所以说通过具体原型类创建出来的对象和原对象的地址是不同的 说多了不好理解,写看波代码 Prototype.java public interface Prototype { SpecificPrototype clone(); } SpecificPrototype.java public class SpecificPrototype implements Prototype { private int property1; private String property2; private Property

【设计模式自习室】原型模式

这一生的挚爱 提交于 2019-12-25 19:36:42
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该设计模式的 详细介绍 ,包括: 引子,意图(大白话解释) 类图,时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :不可以滥用模式 该模式的 实际使用案例 :了解它在哪些重要的源码中出现过 该系列会逐步更新于我的博客和公众号(博客见文章底部) 也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 原型模式 Prototype 引子 还记得深克隆和浅克隆的区别吗?其实这里说的克隆,就是原型模式。 原型模式要求对象实现一个可以克隆自身的接口(类型)。这样一来,通过原型实例创建新的对象。 原型模式也属于创建型模式。 意图 原型模式有两种表现形式: 简单形式 登记形式 他们的区别在于:第二种登记模式中,多了一个原型管理器(PrototypeManager)角色,该角色的作用是:创建具体原型类的对象,并记录每一个被创建的对象。 如果需要创建的原型对象数目较少而且比较固定的话,可以采取简单形式。在这种情况下,原型对象的引用可以由客户端自己保存。 否则,你可以使用登记形式。原型管理器的作用: 在登记形式下,客户端不保存对原型对象的引用

设计模式-原型模式

余生长醉 提交于 2019-12-24 08:31:18
原型模式(Prototype) 浅拷贝: 能够直接拷贝其实际内容的数据类型/只支持9种,八大基本数据类型+String 浅拷贝: 只是拷贝了基本类型的属性数据过来,对于引用类型的属性,两个对象的引用类型的属性指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化 . 深拷贝: 字节码拷贝, 真正获取了一个对象的复制实体,而不是引用, 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,常常采用序列化和反序列化的方式来实现深拷贝,注意对象都要实现Serializable序列化接口 下面展示一些 内联代码片 。 1. 浅拷贝代码 package com . gupaoedu . vip . prototype . simple ; import java . util . ArrayList ; public class ConcretePrototype implements Cloneable { private int age ; private String name ; public ArrayList < String > list = new ArrayList < String > ( ) ; protected Object clone ( ) throws CloneNotSupportedException {