Java设计模式系列(一):单例模式&原型模式

单例模式&原型模式(细胞分裂)(java&python) 关于单例模式与原型模式,度娘上有很多,这里仅将单例模式与原型模式的核心贴出来 文章目录单例模式饿汉模式懒汉模式others:原型模式认识clone浅拷贝深拷贝(使用clone函数)clone 总结原型模式实例(python)原型模式的优缺点深拷贝(Java source code) 单例模式 核心即单例类,意思是这个类(SingleClass)只能创建一个实例 我们将SingleClas... 阅读详情

单例模式(Singleton)-4

懒汉-线程不安全

public class LazySingleton {
    private static LazySingleton lazySingleton = null;

    private LazySingleton() {
    }

    /**
     * 线程不安全
     */
    public static LazySingleton getInstance() {
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}

加锁保证线程安全:在静态方法中直接加锁,并发性能不好。

public static LazySingleton getInstance(){
    synchronized (LazySingleton.class){
        if(lazySingleton==null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}

懒汉-线程安全-double check+volatile

提高并发性能

private volatile static LazySingleton lazySingleton = null;
public static LazySingleton getInstance(){
    if(lazySingleton==null){
        synchronized (LazySingleton.class){
            if(lazySingleton==null){
                lazySingleton = new LazySingleton();
            }
        }
    }
    return lazySingleton;
}

懒汉-线程安全-静态内部类

原理:静态内部类在使用时才加载,不过在加载静态内部类的过程中也会加载外部类,静态内部类有个初始化锁,且初始化只会执行一次,因此线程安全

public class LazyInnerSingleton {
    public static class InnerClass{
        private static LazyInnerSingleton lazyInnerSingleton = new LazyInnerSingleton();
    }
    
    private LazyInnerSingleton() {
    }
    
    public static LazyInnerSingleton getInstance(){
        return InnerClass.lazyInnerSingleton;
    }
}

饿汉-线程安全

立即加载

public class HangrySingleton {
    // final修饰后,在类加载的时候就完成赋值,之后不能改变
//    private final static HangrySingleton hangrySingleton = new HangrySingleton();

    // 静态代码块方式
    private final static HangrySingleton hangrySingleton;
    static {
        hangrySingleton = new HangrySingleton();
    }

    private HangrySingleton() {
    }

    public static HangrySingleton getInstance(){
        return hangrySingleton;
    }
}

原型模式(Prototype )-5

  1. 用于创建重复的对象,同时又能保证性能。当直接创建对象的代价比较大时,则采用这种模式。
  2. 实现Cloneable接口,需要重写clone()方法,克隆不调用构造器

使用案例

@Data
public class Pig implements Cloneable{
    public Pig(String name, Date birthday) {
        this();

        this.name = name;
        this.birthday = birthday;
    }

    public Pig() {
        System.out.println("对象初始化,步骤多,代价很大...");
    }

    private String name;
    private Date birthday;

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

test

@Test
public void test05() throws CloneNotSupportedException {
    Date date = new Date(0);
    Pig pigInit = new Pig("pig0",date);
    for (int i = 0; i < 10; i++) {
        Pig pigTemp = (Pig) pigInit.clone();
        pigTemp.setName("pig"+i);
        pigTemp.setBirthday(new Date());
        System.out.println(pigTemp);
    }
    System.out.println("保存初始值:"+pigInit);
}

打印:

对象初始化,步骤多,代价很大...
Pig(name=pig0, birthday=Thu Jun 04 21:49:39 CST 2020)
...
Pig(name=pig8, birthday=Thu Jun 04 21:49:39 CST 2020)
Pig(name=pig9, birthday=Thu Jun 04 21:49:39 CST 2020)
保存初始值:Pig(name=pig0, birthday=Thu Jan 01 08:00:00 CST 1970)

浅克隆引发的问题

默认浅克隆

浅拷贝引发的问题:
克隆后的对象,虽然对象地址不同,但是其属性是指向同一个引用

@Test
public void test06() throws CloneNotSupportedException {
    Date birth = new Date(0L);
    Pig pig0 = new Pig("佩奇",birth);
    Pig pig1 = (Pig) pig0.clone();

    System.out.println(pig0);
    System.out.println(pig1);

    // 修改引用类型的属性
    pig0.getBirthday().setTime(666666666666L);

    System.out.println(pig0);
    System.out.println(pig1);
}

打印:

对象初始化,步骤多,代价很大...
mxx.design.pattern.creational.prototype.Pig@25f38edcPig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}
mxx.design.pattern.creational.prototype.Pig@3eb07fd3Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}
mxx.design.pattern.creational.prototype.Pig@25f38edcPig{name='佩奇', birthday=Sat Feb 16 09:11:06 CST 1991}
mxx.design.pattern.creational.prototype.Pig@3eb07fd3Pig{name='佩奇', birthday=Sat Feb 16 09:11:06 CST 1991}

pig1的birthday也被修改了。这里需要将该字段变成深克隆

深克隆

在clone方法里对需要深克隆的属性单独克隆

 @Override
public Object clone() throws CloneNotSupportedException {
    Pig pig =  (Pig) super.clone();
    pig.birthday = (Date) pig.birthday.clone();
    return pig;
}

打印

对象初始化,步骤多,代价很大...
mxx.design.pattern.creational.prototype.Pig@25f38edcPig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}
mxx.design.pattern.creational.prototype.Pig@3eb07fd3Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}
mxx.design.pattern.creational.prototype.Pig@25f38edcPig{name='佩奇', birthday=Sat Feb 16 09:11:06 CST 1991}
mxx.design.pattern.creational.prototype.Pig@3eb07fd3Pig{name='佩奇', birthday=Thu Jan 01 08:00:00 CST 1970}

深克隆后,pig1的birthday没有被修改

宏杉MacroSan存储开局指导-流程 目录 1. 导入ODSP授权 2.1.版本确认 2.2.存储设备升级U盘、升级光盘制作方法 开局流程如下: 1. 导入ODSP授权 ODSP授权文件随设备附带,拆箱可见 2.1.版本确认 java模式 html模式 2.2.存储设备升级U盘、升级光盘制作方法 准备工具 空白U盘: 1个,容量要求大于等于4GB。仅制作升级U盘时需要。 制作升级U盘步骤 1.将U盘插入PC机USB口,保证PC机能识别到U盘。 2.运行UltraISO,选择菜单中的 文件-&g... 阅读详情

相关推荐

别再混淆了!一张图看懂SAP特殊采购类30/40/70/80的区别与选型指南

本文深度解析SAP特殊采购类30/40/70/80的核心逻辑与业务影响,通过对比框架和真实案例帮助用户掌握其适用边界。重点介绍委外加工(类型30)、工厂间转移(类型40/70)及计划与执行分离(类型80)的配置要点与常见问题,提供选型决策树和实施检查清单,助力企业优化供应链管理。

weixin_26938645的博客 455

Java设计模式(工厂,单例,原型)

Java设计模式 一、单例模式 ​ 单例模式就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法) 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问同一个实例 由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。 1.1单例模式:饿汉式(静态常量) package com.gl.S

weixin_47171492的博客 562

Jetson Orin边缘语音AI实战:用Riva ASR/TTS + Llama 2打造离线智能语音助手

本文详细介绍了如何利用NVIDIA Jetson Orin的边缘计算能力,结合Riva ASR/TTS语音引擎和Llama 2大语言模型,构建完全离线的智能语音助手。通过硬件优化、量化部署和性能调优,实现在网络不稳定环境下的高效语音交互,适用于智能家居、车载系统等场景。

weixin_29053383的博客 243

单例模式看了就够了

1、饿汉式(线程安全,调用效率高,但是不能延时加载):public class ImageLoader{ private static ImageLoader instance = new ImageLoader; private ImageLoader(){} public static ImageLoader getInstance(){ ...

hukailee的专栏 590

详解k-means++

一、概述 定义:k-means++是一种为k-means聚类算法选择初始值(或“种子”)的算法。它是NP-hard k-means问题的一种近似算法,它是一种避免标准k-means算法有时发现的较弱聚类的方法。 K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0&lt;n&lt;K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚

qq_42364307的博客 3万+

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 396

Java设计模式之到单例模式和原型模式

设计模式是一种设计规范,对于一类问题合理解决的思路与方式,更高效解决一类问题,对于编码来讲就是可以提高程序代码的可读性,可扩展性,复用性可以提高程序员的思维能力,编程能力和设计能力使程序更加标准化,使软件开发效率大大提高使设计的代码可重用性高,可读性强,可靠性高,灵活性好,可维护性强更好的理解源码架构通过设计模式帮助程序员构建更完善的系统编码;编码过程中找到需求会发生变化的地方与不会发生变化的地方,将两者分离开;面向接口编程,而不是面向实现编程;实现高内聚低耦合。

梁恒嘉的博客(https://blog.crazymen.cn/) 951

超详细!思岚S2激光雷达hector_mapping建图

使用思岚S2激光雷达,在ros平台上利用hector_mapping功能包实现建图功能

m0_50965539的博客 5591

java spring 单例模式与原型模式

1.单例模式(Spring默认机制) 从容器get时都是那一个对象 bean id="user2" c1ass="com.kuang.pojo.user" c:age="18" c:name="污渍" ⒉.原型模式:每次从容器中get的时候,都会产生一个新对象 1 &lt;bean id="accountservice" class="com.something.Defau1tAccountservice" scope="prototype" /&gt; ...

zydhb111的博客 710

从零构建NVENC编码器:一个游戏开发者的实战手册

本文详细介绍了如何从零构建NVENC编码器,特别针对游戏开发者提供实战指南。内容涵盖NVENC基础概念、DirectX纹理捕获、异步编码优化及高级特性配置,帮助开发者高效集成硬件编码技术到游戏引擎中,实现高性能游戏录制和直播功能。重点解析了NVIDIA专用编码芯片的优势与API使用技巧。

weixin_29292431的博客 366

Android13配置selinux让system应用可读sys,proc,SN号

Android13预置的system应用,需要读/sys, /proc目录,读(SN)serial number号, 需要修改selinux配置,否则会报avc错.其修改方法会比Android11复杂一些.。

zmlovelx(帅得不敢出门 程序员群31843264) 2655

设计模式(一)--单例模式和原型模式

一、设计模式的分类 总体来说设计模式分为三大类 创建型(5种):主要用于处理对象的创建,实例化对象: 单例,建造者,原型,工厂方法,抽象工厂 结构型(7种):处理类或对象间的组合 适配器,装饰者,结合,桥接,外观,享元,代理 行为型(11种):描述类或对象怎样进行交互和职责分配 策略,观察者,迭代器,命令,备忘录,中介者,解释器,访问者,责任链,状态,模板方法 二、设计模式的...

今夕何年博客 5148

用一套可追溯的闭环,把设备变成可管理的资产:SAP S/4HANA Asset Management 模块详解

摘要:SAP S/4HANA的资产管理模块(EAM)通过标准化流程管理企业资产全生命周期,解决资产状态、需求和资源的不确定性。系统将资产抽象为技术对象,支持纠正性和预防性维护流程,通过维护工单实现可执行的工作包,并与物料管理、财务、生产计划等模块集成形成管理闭环。该模块可帮助降低非计划停机时间,通过数据驱动决策优化维护策略,提升资产可用率和运营效率。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 257

设计模式の单例&工厂&原型模式

本篇是关于设计模式中单例模式(8种,包含线程安全,非安全的实现)、工厂模式(3种)、以及原型模式(深拷贝、浅拷贝)的笔记。

西岭千秋雪的博客 1284

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

单例模式及原型模式

文章目录前言单例模式的应用饿汉式懒汉式通过内部类初始化IDEA下多线程的调试反射暴力攻击单例解决方案及原理分析序列化破坏单例的原理及解决方案。 前言 单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。 例如ServletContext、ServletContextConfig在 Spring 框架应用中 ApplicationContext,数据库的连接池都是单例模式 单例模式的应用 单例模式又分为饿汉式和懒汉式 饿汉式

as513385的博客 1458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

Fatter$hday的博客 1576

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

23种设计模式之单例模式、工厂模式、原型模式、建造者模式

23种设计模式之创建型模式,包含:单例模式、原型模式、工厂模式、工厂方法模式、抽象工厂模式、建造者模式

路漫漫其修远兮,吾将上下而求索 2417

【设计模式】腾讯面经:原型模式怎么理解?

设计模式是编程世界的基石,其中原型模式无疑是一种常用而又高效的创建对象的手段。那么,什么是原型模式呢?又该如何去实现它?在软件工程中,原型模式是一种创建型设计模式。如果创建一个新的对象成本较高,原型模式允许我们复制一个已存在的对象,而非从新构造,这相当于做了一次克隆操作。这就在一定程度上避开了构造函数的约束,极大地提升了程序的执行效率。原型模式是设计模式中一个相当实用的模式,它帮助我们在保证性能的同时,完成对象的生成。它简化了对象的创建,提高了对象的复用性,但同时我们也要注意其所带来的问题。

青玉白露的博客 1680

Java 原型模式、建造者模式、单例模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许你通过复制现有对象来创建新对象,而不是通过实例化类。这种模式在需要大量相似对象时非常有用,因为它可以减少创建对象的开销。

CJW的博客 1507

肝一肝设计模式【三】-- 原型模式

原型模式要求对象实现一个可以克隆自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样的话通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再通过new去创建。

老六说编程的博客 760

设计模式之单例模式及原型模式

单例模式:   单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。  应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访...

吴振照 1102

Java设计模式——单例模式

介绍Java设计模式的八种单例模式

m0_62946761的博客 7270

Java[从菜鸟到高手演变]之设计模式 一

很简单,一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的,具体怎么实现,我会在另一篇文章中,关于解读Java中本地方法的调用,此处不再深究。本小结会通过对象的复制,进行讲解。

u014112513的博客 1917

Java 设计模式・原型模式篇:从思想到代码实现

摘要:本文系统介绍了Java创建型设计模式中的原型模式实现。通过对比赋值、浅克隆和深克隆三种对象复制方式,详细分析了它们在内存地址、基本类型和引用类型处理上的差异。文章提供了用户和地址类的代码示例,演示了浅克隆(实现Cloneable接口)和深克隆(手动递归重写clone()方法和序列化方式)的具体实现方法,并通过测试案例验证了不同克隆方式的行为特性。最后简要提及其他创建型模式(单例、工厂、建造者模式)的参考资源,为Java开发者提供了一套完整的对象创建解决方案。

l7_yuqi的博客 1000

Java 设计模式 - 单例模式

Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录Java 设计模式 - 单例模式单例设计模式介绍单例设计模式八种方式饿汉式 - 静态常量饿汉式(静态常量)应用实例优缺点说明饿汉式 - 静态代码块饿汉式(静态代码块)应用实例优缺点说明懒汉式 - 线程不安全懒汉式线程不安全应用实例优缺点说明懒汉式 - 线程安全,同步方法懒汉式线程安全,同步方法应用实例优缺点说明懒汉式 - 线程安全,同步代码块懒汉式 线程安全,同步代码块应用实例优缺点说明懒汉式 - 双重检查 - 推

霍英俊 1736

创建型模式(原型模式&单例模式)

设计模式 简介: 设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。 随着软件开发社群对设计模式的兴趣日益增长,已经出版了一

weixin_66277385的博客 193
上一篇: SpringAOP之底层原理
下一篇: Java面试之ThreadLocal及其内存泄露
Machine4869
博客等级 码龄10年 9粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值