设计原则&模式:原型模式 Prototype(创建型)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。也就是说,这种不通过new关键字来产生一个对象,而是通过对象复制(Java中的clone或反序列化)来实现的模式,就叫做原型模式。
性能优良:原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环内产生大量的对象时,原型模式可能更好地体现其优点。
逃避构造函数的约束,直接在内存中拷贝,构造函数是不会执行的。(Prototype.java)
浅拷贝与深拷贝实例。(Prototype1.java)
使用场景:
1、类的初始化需要消耗非常多的资源。
2、通过new产生一个对象需要非常繁琐的数据准备或访问。
3、一个对象需要提供给其他对象访问,而且每个调用者可能都需要修改其值时。
Prototype.java
public class Prototype implements Cloneable{
public static void main(String[] args){
Prototype prototype = new Prototype();
/* 执行clone方法创建的Prototype对象 */
Prototype clonePrototype = prototype.clone();
}
public Prototype(){
System.out.println("-----Prototype的构造方法被执行了-----");
}
@Override
protected Prototype clone(){
try{
return (Prototype)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return null;
}
}
浅拷贝
@Data
public class Prototype1 implements Cloneable{
private String name;
private List<String> arrayList = new ArrayList<>();
public static void main(String[] args){
Prototype1 prototype1 = new Prototype1();
prototype1.setName("orign object");
prototype1.setValue("orign object");
Prototype1 clonePrototype1 = prototype1.clone();
clonePrototype1.setName("clone object");
/* 发现添加了clone对象的setValue之后,也修改了prototype1中的arrayList中数据 */
clonePrototype1.setValue("clone object");
System.out.println(prototype1);
System.out.println(clonePrototype1);
}
public void setValue(String value){this.arrayList.add(value);}
public List<String> getValue(){return this.arrayList;}
/**
* 浅拷贝
* @return
*/
@Override
protected Prototype1 clone(){
try{
return (Prototype1)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return null;
}
}
深拷贝
@Data
public class Prototype1 implements Cloneable{
private String name;
private List<String> arrayList = new ArrayList<>();
public static void main(String[] args){
Prototype1 prototype1 = new Prototype1();
prototype1.setName("orign object");
prototype1.setValue("orign object");
Prototype1 clonePrototype1 = prototype1.clone();
clonePrototype1.setName("clone object");
/* 发现添加了clone对象的setValue之后,也修改了prototype1中的arrayList中数据 */
clonePrototype1.setValue("clone object");
System.out.println(prototype1);
System.out.println(clonePrototype1);
}
public void setValue(String value){this.arrayList.add(value);}
public List<String> getValue(){return this.arrayList;}
/**
* 深拷贝
* @return
*/
@Override
protected Prototype1 clone(){
Prototype1 prototype1 = null;
try{
prototype1 = (Prototype1)super.clone();
prototype1.setArrayList(new ArrayList<>());
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype1;
}
}
END
设计原则&模式:原型模式 Prototype(创建型)的更多相关文章
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- 创建型模式 - 原型模式Prototype
孩子生来没娘的NT审核机制,又开始说我涉及到广告了,我涉及到什么广告了?我接着发. 学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 所属:创建型模式 原型模式 一般会和 工场 ...
- Prototype,创建型模式
读书笔记_探索式测试_混合探索式测试 一.测试场景 1.讲述用户故事 2.描述需求 3.演示产品功能 4.演示集成场景 5.描述设置和安装 6.描述警告和出错情况 二.使用基于场景的探索式测试 1 ...
- java设计模式--创建模式--原型模式
原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...
- java-設計模式-原型模式
原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...
- 设计模式学习之原型模式(Prototype,创建型模式)(5)
通过序列化的方式实现深拷贝 [Serializable] public class Person:ICloneable { public string Name { get; set; } publi ...
- 设计模式01 创建型模式 - 原型模式(Protype Pattern)
参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...
- 设计模式(含UML、设计原则、各种模式讲解链接)
一.统一建模语言UML UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法 UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进 ...
- .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...
- ANDROID 中设计模式的採用--创建型模式
所谓模式就是在某一情景下解决某个问题的固定解决方式. 全部的创建型模式都是用作对象的创建或实例化的解决方式. 1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,假设仅仅创建一种固 ...
随机推荐
- CI/CD集成规范
集成方式说明 a.用户向Gitlab提交代码,代码中包含 Dockerfile, JenkinsFile文件. b.Jenkins监听Gitlab代码库的推送和变更事件 c.Jenkins调用mave ...
- Swift中让值类型以引用方式传递
Swift中让值类型以引用方式传递 在 Swift 众多数据类型中,只有 class 是引用类型, 其余的如 Int.Float.Bool.Character.Array.Set.enum.struc ...
- FineReport模板性能问题排查方法
1. 概述 模板的加载速度受到很多因素影响,如果一个模板预览的时候,加载较慢,该如何去分析问题原因呢? 2. 排查步骤 2.1 查看数据集查询速度 大部分模板加载慢,都是因为 sql 执行速度比较慢. ...
- TS 原理详细解读(6)--语法增量解析
呃....4年前开了一个坑,准备写一套完整介绍TS 原理的文章.坑很大,要慢慢填,今天就来填一个把. 本节主要介绍语法增量解析. 什么是增量解析 增量解析的意思是,如果我们直接从源码解析成语法树,叫做 ...
- 【Linux】CentOS7 远程联机
# CentOS7 远程联机 哔哩哔哩 萌狼蓝天 博客:https://mllt.cc 微信公众号:萌狼蓝天 检查与安装配置OpenSSH [CentOS7]检查系统是否安装OpenSSH yum - ...
- manim边学边做--同伦变换
在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素. 与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化. 这 ...
- Unity 3D更换默认脚本编辑器VisualStudio
由于VisualStudio 30天试用到期了,所有不能编辑Unity 3D脚本.需要更换成Notepad++ 打开Unity 3D顶部菜单 点击编辑(Editor)->Preferences- ...
- Docker基础教程快速入门 Linux CentOS安装与使用Docker容器
Docker 介绍 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器解决方案. Docker 将应用程序与该程序的依赖,打包在一个文件里面 ...
- 快速解决MySQL:Table xxx is marked as crashed and should be repaired五个办法
查看MySQL错误日志看到 Table xxx is marked as crashed and should be repaired 解决办法如下 第一种: 1.首先进入mysql命令台: mys ...
- docker和主机之间文件传输
docker和主机之间文件传输 1.从docker内部向主机传输文件 语法: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 示例:将容器96f7 ...