定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。也就是说,这种不通过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(创建型)的更多相关文章

  1. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  2. 创建型模式 - 原型模式Prototype

    孩子生来没娘的NT审核机制,又开始说我涉及到广告了,我涉及到什么广告了?我接着发. 学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 所属:创建型模式  原型模式 一般会和 工场 ...

  3. Prototype,创建型模式

    读书笔记_探索式测试_混合探索式测试   一.测试场景 1.讲述用户故事 2.描述需求 3.演示产品功能 4.演示集成场景 5.描述设置和安装 6.描述警告和出错情况 二.使用基于场景的探索式测试 1 ...

  4. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  5. java-設計模式-原型模式

    原型模式 是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类. 問題: 如果我們要複製一個類實例: 首先, 你必须新建一个属于相同类的对象. 然后, 你必须遍历原始对象的所 ...

  6. 设计模式学习之原型模式(Prototype,创建型模式)(5)

    通过序列化的方式实现深拷贝 [Serializable] public class Person:ICloneable { public string Name { get; set; } publi ...

  7. 设计模式01 创建型模式 - 原型模式(Protype Pattern)

    参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...

  8. 设计模式(含UML、设计原则、各种模式讲解链接)

    一.统一建模语言UML UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法 UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进 ...

  9. .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

    阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...

  10. ANDROID 中设计模式的採用--创建型模式

     所谓模式就是在某一情景下解决某个问题的固定解决方式. 全部的创建型模式都是用作对象的创建或实例化的解决方式. 1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,假设仅仅创建一种固 ...

随机推荐

  1. 《Visual Studio Code 权威指南》登上京东科技IT新书榜第一名!

    自 6 月 30 日开启预售以来,<Visual Studio Code 权威指南>受到了许多读者朋友的青睐.感谢大家的支持! 仅仅三天时间,<Visual Studio Code ...

  2. IDEA和GIT关于文件中LF和CRLF问题

    问题描述:项目软件安装shell脚本上git仓库管理,但拉取后,上linux运行报错. 问题思考:根据描述信息可以查看到\r字样,初步判别为换行符导致 1.将脚本文件移动至notepad++中,通过视 ...

  3. Ubuntu 16.04 配置Windows 远程桌面(RDP & Unity Desktop)

    网上大多数方法安装完成后不是连不上就是花屏或者桌面环境变了,本方法可以解决以上问题. 一键配置脚本: 运行前chmod +x xrdp-installer-1.2.2.sh 添加权限,执行时不需要ro ...

  4. Linux服务器环境安装mysql

    背景 1.安装环境:kvm虚拟机 2.运行环境:linux 3.架构:x86 4.安装mysql版本:mysql-5.7 1.安装准备 # Mysql官网 https://downloads.mysq ...

  5. 记录一个uniapp写的小程序的手写板,横屏,用于签名,也可竖屏

    今天需要在小程序增加一个手写板的功能,但是得横向的手写纵向的保存,直接上代码,竖屏的时候不需要旋转图片 <template> <view class="wrapper&qu ...

  6. CDS标准视图:付款锁定原因 I_PaymentBlockingReason

    视图名称:付款锁定原因 I_PaymentBlockingReason 视图类型:基础视图 视图代码: 点击查看代码 //Documentation about annotations can be ...

  7. Java经典面试36题和答案

    1."static"关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? "static"关键字表明一个成员 ...

  8. biancheng-Redis教程

    目录http://c.biancheng.net/redis/ 1Redis是什么2Windows下载安装Redis3Ubuntu下载安装Redis4Redis配置文件5Redis数据类型6Redis ...

  9. Linux系统中的lsmod、lsof、lspci、lsscsi命令及实例

    作为运维同学怎能不知道Linux系统中的lsmod.lsof.lspci.lsscsi命令呢,今天就来盘一盘她及实例. 1.lsmod命令 Linux lsmod命令用于显示已经加载到内核中的模块的状 ...

  10. Dotnet程序的内存与垃圾回收

    都知道程序运行时的变量是放在内存里的,从我们学c++ 就知道有析构函数  malloc,还有学c#的时候天天 什么垃圾回收 GC 像背八股文样的 ,但是这个内存究竟能分配多少 没有人想过吧 ,不论做什 ...