Java设计模式圣经连载(04)-单例模式

Java单例7种测试实践 单例:一个进程中只能存在唯一一个对象。 1.饿汉模式。 主动型太粗暴。 /** * @author :jiaolian * @date :Created in 2021-01-10 21:25 * @description:饿汉单例测试 * @modified By: * 公众号:叫练 */ public class HungerSignletonTest { //类初始化会创建单例对象 private static HungerSignletonTest signleton 阅读详情
 
Java设计模式圣经连载(04)-单例模式
 
单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
 
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
 
说明:一下的代码来自阎宏博士的《Java与模式》一书,其中对一些类的写法做调整(符合Java1.5的习惯),另外还加了测试方法。
 
 
一、懒汉式单例
 
在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-11
 * Time: 14:57:08
 * <<Java与模式>> 单例模式-懒汉式单例
 */
public class LazySingleton {
    /**
     * 私有静态对象,加载时候不做初始化
     */
    private static LazySingleton m_intance=null;
 
    /**
     * 私有构造方法,避免外部创建实例
     */
    private LazySingleton(){
 
    }
 
    /**
     * 静态工厂方法,返回此类的唯一实例. 
     * 当发现实例没有初始化的时候,才初始化.
     * @return LazySingleton
     */
    synchronized public static LazySingleton getInstance(){
        if(m_intance==null){
            m_intance=new LazySingleton();
        }
        return m_intance;
    }
}
 
 
二、饿汉式单例
 
在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-11
 * Time: 14:45:25
 * <<Java与模式>> 单例模式-饿汉式单例
 */
public class EagerSingleton {
    /**
     * 私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象
     */
    private static final EagerSingleton m_instance = new EagerSingleton();
 
    /**
     * 私有构造方法,避免外部创建实例
     */
    private EagerSingleton() {
    }
 
    /**
     * 静态工厂方法,返回此类的唯一实例.
     * @return EagerSingleton
     */
    public static EagerSingleton getInstance() {
        return m_instance;
    }
}
 
三、登记式单例
 
这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2005-9-11
 * Time: 15:20:16
 * <<Java与模式>> 单例模式- 登记式单例
 */
public class RegSingleton {
    /**
     * 登记薄,用来存放所有登记的实例
     */
    private static Map<String, RegSingleton> m_registry = new HashMap();
 
    //在类加载的时候添加一个实例到登记薄
    static {
        RegSingleton x = new RegSingleton();
        m_registry.put(x.getClass().getName(), x);
    }
 
    /**
     * 受保护的默认构造方法
     */
    protected RegSingleton() {
    }
 
    /**
     * 静态工厂方法,返回指定登记对象的唯一实例;
     * 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
     * @param name
     * @return RegSingleton
     */
    public static RegSingleton getInstance(String name) {
        if (name == null) {
            name = "RegSingleton";
        }
        if (m_registry.get(name) == null) {
            try {
                m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return m_registry.get(name);
    }
 
    /**
     * 一个示意性的商业方法
     * @return String
     */
    public String about() {
        return "Hello,I am RegSingleton!";
    }
}
 
四、单例模式的一个应用
 
该应用是配置文件管理类。为了本例能正确运行,我在C盘下先建立了一个xxxx.properties文件,内容如下:
 
-------------------
user=root
password=leizhimin
 
 
这个配置文件管理类的代码如下:
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2005-9-11
 * Time: 15:55:01
 * 单例模式应用-单例类应用-配置文件管理
 */
public class ConfigManager {
 
    /**
     * 属性文件全名
     */
    private static final String PFILE = "C:\\xxx.properties";
 
    /**
     * 对应于属性文件的文件对象变量
     */
    private File m_file = null;
    /**
     * 属性文件的最后修改日期
     */
    private long m_lastModifiedTime = 0;
    /**
     * 属性文件所对应的属性对象变量
     */
    private Properties m_props = null;
    /**
     * 本类可能存在的唯一的一个实例
     */
    private static ConfigManager m_instance = new ConfigManager();
 
    /**
     * 私有构造子,用以保证外界无法直接实例化
     */
    private ConfigManager() {
        m_file = new File(PFILE);
        m_lastModifiedTime = m_file.lastModified();
        if (m_lastModifiedTime == 0) {
            System.err.println(PFILE + " file does not exist!");
        }
        m_props = new Properties();
        try {
            m_props.load(new FileInputStream(PFILE));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 静态工厂方法
     *
     * @return ConfigManager
     */
    synchronized public static ConfigManager getInstance() {
        return m_instance;
    }
 
    /**
     * 获取属性配置项的值
     *
     * @param name
     * @param defaultVal
     * @return Object
     */
    public final Object getConfigItem(String name, Object defaultVal) {
        long newTime = m_file.lastModified();
        if (newTime == 0) {
            //属性文件不存在
            if (m_lastModifiedTime == 0) {
                System.err.println(PFILE + " file does not exist!");
            } else {
                System.err.println(PFILE + " file was deleted!");
            }
            return defaultVal;
        } else if (newTime > m_lastModifiedTime) {
            m_props.clear();
            try {
                m_props.load(new FileInputStream(PFILE));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        m_lastModifiedTime = newTime;
        Object val = m_props.getProperty(name);
        if (val == null) {
            return defaultVal;
        } else {
            return val;
        }
    }
}
 
测试配置文件类:
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-11
 * Time: 16:42:45
 * 配置文件管理类测试
 */
public class Test_ConfigManager {
    public static void main(String[] args) {
        ConfigManager cfgm = ConfigManager.getInstance();
        Object val1 = cfgm.getConfigItem("sdf", "leizhimin");
        Object val2 = cfgm.getConfigItem("user", "leizhimin");
        System.out.println(val1.toString());
        System.out.println(val2.toString());
    }
}
 
运行结果:
 
leizhimin
root
 
Process finished with exit code 0
 
 
五、笔者写的一个JDBC数据库工具类的单例实现
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2005-9-11
 * Time: 18:04:46
 * 单例模式在JDBC编程中的应用,用于设计数据库工具类
 */
public class DBUtil {
    //单一实例
    private static final DBUtil _instance = new DBUtil();
    //数据源的JNDI
    private static final String datasource = "java:comp/env/jdbc/zvfims";
 
    /**
     * 私有构造方法,防止外部实例化
     */
    private DBUtil() {
    }
 
    /**
     * 数据库工具类实例工厂
     *
     * @return DBUtil
     */
    public DBUtil getInstance() {
        return _instance;
    }
 
    /**
     * 业务方法:用于获取数据库连接
     *
     * @return Connection
     */
    public Connection makeConnection() {
        Connection conn = null;
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup(datasource);
            conn = ds.getConnection();
        } catch (NamingException e) {
            System.out.println("获取数据源异常,请AppServer的JNDI数据源配置!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("获取数据库连接发生异常!");
            e.printStackTrace();
        }
        return conn;
    }
}
 
通过这个单例类和开放的业务方法,可以为整个系统应用提供数据库连接。
 
 

 
 
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/41983

海康威视 2DC 系列球机手机直连实用教程 海康威视2DC系列球机手机直连教程:首先确认设备支持直连功能并下载官方"海康互联"App;通过网线连接球机与路由器,使用SADP软件调整IP至同一网段;在App中添加设备并激活,完成调试即可远程查看监控画面。常见问题包括部分型号需远程解锁、网络连接异常等,可通过检查网络环境、联系客服等方式解决。本教程提供从准备到连接的完整指引,助您轻松实现手机监控管理。 阅读详情

相关推荐

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4517

单例模式的好处和缺点?为什么要用单例模式?

单例模式含义】单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。【采用单例模式动机、原因】对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工

not_give_up_的博客 3万+

SAP OBYC自动过账全解析:从BSX到WRX的会计科目配置指南

本文深入解析SAP OBYC自动过账功能,从BSX到WRX的会计科目配置全流程,涵盖评估分组代码、事务码和评估类等核心概念。通过实战案例展示如何实现库存变动到财务过账的自动化流转,提升企业财务数据的准确性和效率。

weixin_29239279的博客 421

Java设计模式之单例模式(附简单案例)

一、简单描述 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意看这里 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 分类 单例模式就实例的创建时机来划分可分为:懒汉式与饿汉式两种。

程序猿爱篮球 6525

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 307

五种音频器件综合对比——《器件手册--音频器件》

音频器件当在蜂鸣片的两片电极之间接通交流音频信号时,蜂鸣片会根据信号的大小和频率发生振动,从而产生相应的声音。结构简单、造价低廉。广泛应用于玩具、电子表、电子仪器、电子钟表、定时器等电子电器方面。蜂鸣器是一种一体化结构的电子讯响器,采用直流电源供电,广泛应用于各种电子产品中作发声器件有源蜂鸣器:内部带震荡源,通电即发声,程序控制方便。无源蜂鸣器:内部不带震荡源,需用方波驱动,声音频率可控,价格相对便宜。计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品。

XU157303764的博客 1538

单例模式的好处?

单例的好处?啥时候不能用单例?    优点:单例模式保证java应用程序中,一个类Class只有一个实例在,使用单例模式好处在于可以节省内存,节约资源,对于一般频繁创建和销毁对象的可以使用单例模式。  因为它限制了实例的个数,有利于java垃圾回收。好的单例模式也能提高性能。例如:数据库连接池、httpclient连接单例 对于系统中的某些类来说,只有一个实例很重要,Windows中就...

兰博基尼 5043

UCIE Specification详解(七)

Logical Physical Layer(逻辑物理层)

Crazzy_M的博客 1692

java 单例模式的好处

http://blog.youkuaiyun.com/xiaolongyiqi/archive/2009/02/23/3928509.aspx http://crazyfeng.javaeye.com/blog/937866 http://gaojiewyh.javaeye.com/blog/411889

cnjavatyro的专栏 2万+

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

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

RNA-seq分析:Step8(富集分析)

RNA-seq富集分析是一种用于分析基因表达数据中特定基因或通路是否富集的分析方法。其基本思想是比较不同基因对应的转录本/基因之间的表达差异及其对应的基因注释信息,通过统计学方法评估差异的显著性,从而确定是否存在某些特定的功能通路或基因集合富集的情况。常用的RNA-seq富集分析工具包括GOseq、KEGG(KEGG enrichment analysis)、DAVID(Database for Annotation, Visualization and Integrated Discovery)等。这

沉香best的博客 3634

java泛型单例_Java设计模式圣经连载(04)-单例模式

Java设计模式圣经连载(04)-单例模式单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。说明:一下的代码来自阎宏博士的《Java与模式》一书,其中对一些类的写法做调整(...

weixin_29446529的博客 213

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 796

java单例模式

 java单例模式2007年10月30日 星期二 上午 09:57Java设计模式圣经连载(04)-单例模式单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。

叶落枫亭 3940

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

(04)-单例模式

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/41983 Java设计模式圣经连载(04)-单例模式   单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。 单例模式分三种:懒汉式单例、饿汉式单例、

Mr.Simple的专栏 1247

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

单例模式

Java设计模式圣经连载(04)-单例模式 单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 说明:一下的代码来自阎宏博士的《Java与模式》一书

ailands的专栏 392

java单例模式 .

Java设计模式圣经连载(04)-单例模式 单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创

guanghua2009的专栏 450

java中什么叫懒加载_java懒加载的原理

聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=” subselect”、batch-size 配置了 lazy=”true”一定会实现懒加载吗......这里只是简单谈了下对象到关系 型数据库的映射,就不讨论hibernate那些懒加载和缓存 等技术了。 相关的类有Class、Field、Method以及Const...

weixin_42525428的博客 3226

1.4、单例模式

Java设计模式圣经连载(04)-单例模式   单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。   单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。   说明:一下的代码来自阎宏博士的《J

zc2003的专栏 415

java单例模式具体例子_Java的单例模式例子

Java的单例模式例子1. 先写一个Singleton的classpackage stone;public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance(){if(instance==null)instance= new Sin...

weixin_34563472的博客 776

设计模式-单例模式及应用场景

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

huangshunjiu123的博客 1192

java 中的单例模式,三种最佳实例

java 中单例模式的五种实现方式,两种简单实现,三种最佳实践

yk950309的博客 1271

Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

单例模式是一种创建型设计模式,它保证了一个类只有一个实例,并且提供了一个全局访问点。本文将介绍单例模式的定义、原理、优缺点、实现方式和应用场景。

weixin_44186179的博客 2450

JAVA设计模式之单例模式

本文继续介绍23种设计模式系列之单例模式。 概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例...

一个本科小生的奋斗史 101万+

Java设计模式之——单例模式(5种类型)

而且由于单例对象是在静态内部类中创建的,所以可以避免资源浪费。静态内部类单例模式是指将单例对象作为静态内部类的一个静态变量,这种实现方式可以保证线程安全,同时也可以避免资源浪费。静态内部类单例模式是指将单例对象作为静态内部类的一个静态变量,这种实现方式可以保证线程安全,同时也可以避免资源浪费。双重检查锁单例模式是指在懒汉式单例模式的基础上加入了双重检查锁机制,可以保证线程安全,同时也避免了资源浪费。双重检查锁单例模式是指在懒汉式单例模式的基础上加入了双重检查锁机制,可以保证线程安全,同时也避免了资源浪费。

VA_AV的博客 2105

java单例模式 实例_详解Java单例模式5种实现方法

单例模式是最简单的设计模式之一,也是Java面试的高频题,有的甚至要求手写单例模式,下面我们就来详细讲解Java单例模式的5种实现方法。首先,我们来了解下创建单例的四大原则:构造方法必需是私有的;以静态方法或枚举返回实例;确保实例只有一个,尤其在多线程环境下确保反序列化时不会重新构建对象常用的单例创建方式有:饿汉式、懒汉式、双重锁检测式(DCL)、静态内部类、枚举模式,下面就来依次讲解一下:饿汉式...

weixin_34145350的博客 533
上一篇: Java设计模式圣经连载(02)-工厂方法(Factory Method)模式
下一篇: Java设计模式圣经连载(05)-代理模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值