Java--设计模式-12-单例模式

简介: 单例模式(Singleton Pattern)负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。也属于创建型模式。

单例模式(Singleton Pattern)负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。也属于创建型模式。

直接代码实现:

一、饿汉式

packagecom.xing.design.singleton;
/***  单例模式* @author xing*/publicclassSingletonObj {
//创建 SingletonObj 的一个对象privatestaticSingletonObjinstance=newSingletonObj();
//构造方法私有化privateSingletonObj(){}
//对外提供访问入口,因为关闭了构造方法,所以只能从这个入口访问本类对象publicstaticSingletonObjgetInstance(){
returninstance;
  }
//写个方法用来调用publicvoidtest() {
System.out.println("单例模式实例化对象的测试方法。。。");
  }
}


测试:

packagecom.xing.design.singleton;
publicclassSingletonDemo {
publicstaticvoidmain(String[] args) {
SingletonObjsingletonObj1=SingletonObj.getInstance();
singletonObj1.test();
//再来一个对比下hashCodeSingletonObjsingletonObj2=SingletonObj.getInstance();
singletonObj2.test();
System.out.println("singletonObj1=>"+singletonObj1.hashCode());
System.out.println("singletonObj2=>"+singletonObj2.hashCode());
  }
}

结果:

image.png

       可以看到两次获取的对象hashCode码一样,是同一个对象哈。

       上述这种写法是在类加载的时候就实例化了对象,这种写法叫饿汉式。但是如果这个对象一直没有用,就造成了内存浪费,没有达到懒加载(Lazy Loading)的效果。

我理解的懒汉式和饿汉式:

懒汉式是用的时候再实例化,饿了再做饭。或者有句话叫啥来着,想蹲坑了才修厕所呢,哈哈哈

饿汉式是先实例化,用的时候直接取用。就跟饿过的人一样,先把饭做好,饿了就能吃。

二、懒汉式

packagecom.xing.design.singleton;
/***  单例模式* @author xing*/publicclassSingletonObj2 {
//创建 SingletonObj 的一个对象privatestaticSingletonObj2instance;
//构造方法私有化privateSingletonObj2(){
System.out.println("构造个SingletonObj2");
  }
//对外提供访问入口,因为关闭了构造方法,所以只能从这个入口访问本类对象publicstaticSingletonObj2getInstance(){
if(instance==null) {
instance=newSingletonObj2();
    }
returninstance;
  }
publicvoidtest() {
System.out.println("单例模式实例化对象的测试方法。。。");
  }
}


测试:

packagecom.xing.design.singleton;
publicclassSingletonDemo {
publicstaticvoidmain(String[] args) {
SingletonObj2singletonObj21=SingletonObj2.getInstance();
singletonObj21.test();
//再来一个对比下hashCodeSingletonObj2singletonObj22=SingletonObj2.getInstance();
singletonObj22.test();
System.out.println("singletonObj21=>"+singletonObj21.hashCode());
System.out.println("singletonObj22=>"+singletonObj22.hashCode());
  }
}

结果:

image.png

       这种写法起到了Lazy Loading的效果,不过main方法调用的时候都是第一次加载类哈,看不出来,不过倒是能看出来获取两个实例对象只调用过一次构造哈,更能说明单例模式多次返回的都是同一个对象。

三、双重检验管控的线程安全单例模式

packagecom.xing.design.singleton;
/*** 懒汉模式-线程安全,适用于多线程*/publicclassSingletonObj3{
privatestaticvolatileSingletonObj3safeSingleton;//防止指令重排privateSingletonObj3() {
System.out.println("构造个SingletonObj3");
    }
publicstaticSingletonObj3getInstance(){
if(safeSingleton==null){
synchronized (SingletonObj3.class){
if(safeSingleton==null){//双重检测safeSingleton=newSingletonObj3();
                }
            }
        }
returnsafeSingleton;
    }
publicvoidtest() {
System.out.println("单例模式实例化对象的测试方法。。。");
  }
}

测试及结果:

image.png

       重排序是为了优化性能,但是不管怎么重排序,在单线程下一定能保证结果的正确性,但是在多线程环境下,可能发生重排序,影响结果。具体底层的我也不懂,以后再学吧。这里要禁用重排序,就用了volatile 关键字。


总结:

       单例模式只能由自己创建并始终只有一个实例化对象,核心代码是构造方法私有化、提供一个静态方法作为唯一访问入口。

       应用场景有:当前系统登录人数管理、Java的Runtime、线程池等频繁的创建和销毁对象的情况。


END

目录
相关文章
|
2月前
|
设计模式 安全 Java
Java编程中的单例模式深入剖析
【10月更文挑战第21天】在Java的世界里,单例模式是设计模式中一个常见而又强大的存在。它确保了一个类只有一个实例,并提供一个全局访问点。本文将深入探讨如何正确实现单例模式,包括常见的实现方式、优缺点分析以及最佳实践,同时也会通过实际代码示例来加深理解。无论你是Java新手还是资深开发者,这篇文章都将为你提供宝贵的见解和技巧。
105 65
|
17天前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
23天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
23 2
|
26天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
38 4
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
49 2
|
1月前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
28天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
22 1

热门文章

最新文章