java 23种常用设计模式之原型模式(Prototype)

快速原型模型     快速原型模型需要迅速建造一个可以运行的软件原型 ,以便理解和澄清问题,使开发人员与用户达成共识,最终在确定的客户需求基础上开发客户满意的软件产品。 快速原型模型允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义,快速设计开发出软件系统的原型,该原型向用户展示待开发软件的全部或部分功能和性能;用户对该原型进行测试评定,给出具体改进意见以丰富细化软件需求;开发人员据此对软件进行修改完善... 阅读详情

心情不好不想说话,是天下人的共性吧?

今天不想吹水,亲们直接看代码吧!我想说的都在代码里了!

package com.freedom.prototype;
/*
 * 原型模式的思想:
 * 用原型实例指定创建对象的种类,并通过复制、克隆这些原型创建新的对象。
 * 在JDK中复制对象就是通过clone()实现的。
 * 一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,
 * 因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,
 * 因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,
 * 而在Object类中,clone()是native的,具体怎么实现,此处不深究。
 */
public class Prototype implements Cloneable {  
	
	/*
	 * 实现Cloneable接口。
	 * Cloneable接口的作用:
	 * 在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。
	 * 在java虚拟机中,只有实现了这个接口的类才可以被拷贝,
	 * 否则在运行时会抛出CloneNotSupportedException异常。
	 */
	public Object clone() throws CloneNotSupportedException {
		
		/*
		 * 重写Object类中的clone方法。
		 * Java中,所有类的父类都是Object类,Object类中有一个clone方法,
		 * 作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,
		 * 因此,Prototype类需要将clone方法的作用域修改为public类型。
		 */
		Prototype proto = (Prototype) super.clone();
		return proto;
	}
	
	public static void main(String[] args) throws Exception{  
        ConcretePrototype cp = new ConcretePrototype();  
        ConcretePrototype clonecp = (ConcretePrototype)cp.clone();  
        clonecp.show();  
    } 

}
//Prototype实现类
class ConcretePrototype extends Prototype{  
    public void show(){  
        System.out.println("test Prototype");  
    }  
}  
这就是原型模式!一种比较简单的模式,也非常容易理解,实现一个接口,重写一个clone方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

原型模式的优点及适用场景

       使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

       使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

       因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
  • 深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。例如:
    package com.freedom.prototype;
    
    import java.util.ArrayList;
    
    public class Prototype1 implements Cloneable {
    	private ArrayList list = new ArrayList();
    
    	public Prototype1 clone() {
    		Prototype1 prototype = null;
    		try {
    			prototype = (Prototype1) super.clone();
    			prototype.list = (ArrayList) this.list.clone();
    		} catch (CloneNotSupportedException e) {
    			e.printStackTrace();
    		}
    		return prototype;
    	}
    }

 由于ArrayList不是基本类型,所以成员变量list,不会被拷贝,需要我们自己实现深复制,java提供的大部分的容器类都实现了Cloneable接口。

深复制与浅复制问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅复制。

至于大家如果对深复制和浅复制有什么疑问的话继续看下面的实现代码:

package com.freedom.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/*
 * 要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。
 * 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
 * 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
 */
public class Prototype2 implements Cloneable, Serializable {

    private static final long serialVersionUID = 1L;
    private String string;

    private SerializableObject obj;

    /* 浅复制 */
    public Object clone() throws CloneNotSupportedException {
        Prototype proto = (Prototype) super.clone();
        return proto;
    }

    /* 深复制 */
    public Object deepClone() throws IOException, ClassNotFoundException {

        /* 写入当前对象的二进制流 */
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        /* 读出二进制流产生的新对象 */
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }

    public SerializableObject getObj() {
        return obj;
    }

    public void setObj(SerializableObject obj) {
        this.obj = obj;
    }

}

class SerializableObject implements Serializable {
    private static final long serialVersionUID = 1L;
}
   
Finish!

源码下载:http://download.youkuaiyun.com/detail/github_22022001/8302571



UniApp消息推送进阶:不用插件实现动态语音播报(含保活策略) 本文详细介绍了在UniApp中实现动态语音播报的进阶方案,无需依赖第三方插件。核心采用透传消息传递动态数据,结合本地TTS引擎合成语音,并针对不同安卓厂商提供了深度通道配置与差异化保活策略,有效解决了App退至后台或被清理后语音播报失效的难题。 阅读详情

相关推荐

使用CAPL实现DoIP刷写

本文介绍了使用CAPL实现基于DoIP协议的ECU刷写方法,包含完整源码。

qq_56033302的博客 2760

快速原型开发模式在实际开发过程中的应用

【摘要】本文以作者的实践开发经验为主线,从理论和实际的角度探讨快速原型开发模式在实践开发中的应用,并从软件开发的各个角度、各个时期剖析快速开发模式的优缺点和应该注意的问题。【关键字】软件工程、开发模式、快速开发、软件开发、原型模式    快速原型开发模式的基本思想是在系统开发的初期,在对用户需求初步了解的基础之上,以快速的方法先构造一个可以工作的系统原型。将这个原型提供给用户使用,听取他们

加菲猫的快乐生活--我的理想 1450

Aspice的理解

ASPICE 是由汽车行业的主要公司和组织合作开发的,包括德国汽车工业联合会(VDA)和国际汽车工作组(Automotive SIG)。其目标是通过标准化的软件开发流程,提高汽车电子系统的软件质量和可靠性。

hkj8808的博客 2015

常用设计模式——深入理解原型模式

定义: 原型模式(Prototype Pattern)是指用原型实例指定创建对象的 种类,并且通过拷贝这些原型创建新的对象 调用者不需要知道任何创建细节,不调用构造函数 属于创建性模式 那么定义有了,它的使用场景又在哪些地方呢? 使用场景:(原型模式是在内存二进制流直接拷贝) 类初始化消耗资源较多 new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等) 构造函数比较复杂 循环体中生...

zhan_lang的博客 335

家长必看!用RouterOS轻松屏蔽不良网站,保护孩子上网安全

本文为家长提供了一份详细的RouterOS路由器配置指南,旨在通过技术手段保护儿童上网安全。文章核心介绍了如何利用RouterOS的DNS静态条目功能,轻松实现禁止访问特定不良网站,并结合防火墙时间规则,为孩子构建一个纯净、可控的家庭网络环境,操作简单,无需专业背景。

weixin_28363123的博客 1266

视频预处理--经典方法卷积3D

在三维卷积操作中,卷积核不仅在空间维度上滑动,还在时间维度上滑动,从而同时捕捉时间和空间上的特征。通过合理设置步长和填充,可以灵活控制输出特征图的大小和特征提取的效果。你的理解非常准确:三维卷积核就像是一个长度为 3 的滑动窗口,每次选取 3 个连续的帧进行卷积操作,而步长和填充则进一步优化了这一过程。

m0_73359068的博客 1649

python设计模式(三):原型模式—快速实例化类的一种途径

原型是相对于复制、克隆而言,但是不同于模板,模板创造出的东西是一模一样,而原型创造的东西是允许差异化和个性化存在,这就是原型。   原型模式最为核心的两点是:拷贝、属性更新;拷贝指深拷贝copy.deepcopy,属性更新是类的自有属性__dict__的更新。   实例代码: # -*- coding:utf-8 -*- import copy class Information...

python之战 582

QT播放器插件内嵌浏览器配合流媒体实现国标摄像头网页端播放

基本原理在浏览器⽹页中的指定播放窗口的位置和⼤⼩,实现⼀个内嵌到⽹页中显⽰的播放窗⼝,前端还必须可对这个内嵌播放窗⼝进⾏控制,⽽且播放窗⼝必须跟随浏览器窗⼝的移动和缩放、⽹页滚动、标签页切换、关闭等操作进⾏⾃动联动。播放器可以通过QT实现。这个播放窗⼝同时提供Web Socket的服务端和JSON打包命令的解析执⾏模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗⼝。

cameravision的博客 562

Prototype中的类创建-对比Java

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> var Person = Class.create(); // 类的声明 |public class Person { // 类的声明

北一 596

Claude Code 100个真实案例 - 用AI搭建GIS地理信息系统(地图标注+热力图)

本案例展示如何使用 Claude Code 从零搭建一个完整的 GIS 地理信息系统。我们将使用 Python + Flask 作为后端,Leaflet.js 作为前端地图引擎,实现地图标注、热力图展示、区域绘制、坐标搜索等功能。全程通过与 Claude Code 对话完成,让你感受 AI 在地理信息领域的强大开发能力。

yueyeguzhuo的专栏 113

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

23种设计模式之原型模式(Prototype Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

vLLM显存逆向计算:如何得到最优gpu-memory-utilization参数

本文提出了一种**逆向工程**的思路:基于vLLM显存占用的底层机制,通过精确计算模型权重、KV缓存、激活内存等各组件的显存需求,**倒推出最优的gpu-memory-utilization参数**。这种方法让我们能够在部署前就准确预估资源需求,实现一次配置、稳定运行。本文我们将从vLLM显存计算的核心原理出发,构建完整的倒推计算框架和源码,并通过大量实验验证其准确性(会有误差,但基本可以直接使用)。

羊城迷鹿的博客 1947

23种设计模式——原型模式 (Prototype Pattern)详解

本文介绍了23种经典设计模式之——原型模式 (Prototype Pattern)的说明及使用

Meteors.的博客 1001

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java原型模式(prototype)

 &amp;amp;emps;prototype模式也就是原型模式,是javaGOF23种设计模式中的一种,我们在学习spring的时候在bean标签的学习中碰到过,所以本文来给大家介绍下原型模式 原型模式  &amp;amp;emps;在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。  &amp;amp;emp...

波波烤鸭的博客 7193

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入JAVA框架学习23种设计模式-原型模式

快速失败机制的实现是通过在集合的内部维护一个计数器(modCount),每次修改集合时都会增加计数器的值。接下来这段代码是我们今天的重点第一个判断显然是对单例模式bean对象的获取,最主要我们来看第二个,即对原型模式bean对象获取方法,首先将prototypeInstance赋为空值null,定义了一个Object对象prototypeInstance,注意这两个对象并不是一个对象,它们所处的作用域不同即位于不同的{}内的代码块,prototypeInstance在上个代码块中时String[]对象。

weixin_61854715的博客 1170

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

Java-23个设计模式 Prototype 原型模式

Prototype 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 ① 从工厂模式中的例子过来,将工厂基类创建对象的抽象类移到系统抽象类,用Java克隆代替 /** * 抽象类 */ public abstract class ComputerSystem implements Cloneable { abstract void run(); pu...

weixin_42321815的博客 136

Java设计模式——原型模式【ProtoType Pattern】

Java设计模式、原型模式

scorpio的博客 496

设计模式之原型模式(Prototype Pattern)

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。何时使用:1、当一个系统应该独立于它的产品创建,构成和表示时。2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。3、为了避免创建一个与产品类层次平行的工厂类层次时。4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

weixin_42294716的博客 859

23种设计模式-原型(Prototype)设计模式

23种设计模式-原型(Prototype)设计模式

Hanson的博客 2133

【Java中23种面试常考的设计模式之原型模式(prototype)---创建型模式】

【Java中23种面试常考的设计模式之原型模式(prototype)---创建型模式】1. 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。2. 在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。原型模式我们也称为克隆模式,即一个某个对象为原型克隆出来一个一模一样的对象,该对象的属性和原型对象一模一样。而且对于原型对象没有任何影响。原型模式的克隆方式有两种:浅克隆

Coder_ljw的博客 448

设计模式(23):创建型-原型模式(Prototype)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 设计模式分为三种类型,共23种。 创建型模式(5):单例模式、抽象工厂模式、建造者模式...

後雪寒的专栏 661

Java GoF 23种设计模式-创建型模式-原型模式(Prototype Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、代码实现五、优缺点5.1 原型模式优点5.2 原型模式缺点 一、模式定义 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象, 而又无需使代码依赖它们所属的类。原型模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用原型模式。 二、模式动机 在我们应用程序可能有某些对象的结构比较复杂,但是我们又需要频繁的使用它们,如果这个时候我们来不断的新建这个对象势必会大大损耗系统内存的,这个时候

WU4566285的博客 373

java设计模式之Prototype 原型模式(浅拷贝和深拷贝)纯干货

前言 prototype模式也就是原型模式,是javaGOF23种设计模式中的一种,我们在学习spring的时候在bean标签的学习中碰到过,所以本文来给大家介绍下原型模式 什么是原型模式? 其实原型模式在我们的代码中是很常见的,但是又容易被我们所忽视的一种模式,那么什么是原型模式呢? 原型模式其实就是一种克隆对象的方法,在我们的编码时候是很常见的,比如我们常用的的BeanUtils.copyProperties就是一种对象的浅copy,其实现在我们实例化对象操作并不是特别耗费性能,所以在针对一些特

守夜人爱吃兔子的博客 690

GOF23设计模式之原型模式-Prototype

原型模式及深拷贝、浅拷贝详解原型模式 -Prototype概述类型:创建型设计模式适用场景:关键代码UMLcoding优点缺点深拷贝、浅拷贝 本文简单介绍原型模式,以及深拷贝、浅拷贝的区别与问题。 原型模式 -Prototype 概述 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 不需要知道任何创建的细节,不调用构造函数 类型:创建型设计模式 适用场景: 类初始化消耗较多资源 new产生一个对象需要非常繁琐的过程(数据准备、访问权限等) 构造函数比较复杂 循环体中产生大量的对象

zhengyong14350的博客 244
上一篇: java23种常用设计模式之模板方法模式(Template Method)
下一篇: 浅谈java中的this和super
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值