设计模式-12-单例模式

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

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

直接代码实现:

一、饿汉式

package com.xing.design.singleton;


/**

*  单例模式

* @author xing

*/

public class SingletonObj {

//创建 SingletonObj 的一个对象

private static SingletonObj instance = new SingletonObj();

//构造方法私有化

private SingletonObj(){}

//对外提供访问入口,因为关闭了构造方法,所以只能从这个入口访问本类对象

public static SingletonObj getInstance(){

return instance;

 }

//写个方法用来调用

public void test() {

   System.out.println("单例模式实例化对象的测试方法。。。");

 }

}


测试:

package com.xing.design.singleton;


public class SingletonDemo {

public static void main(String[] args) {

   SingletonObj singletonObj1 = SingletonObj.getInstance();

   singletonObj1.test();

//再来一个对比下hashCode

   SingletonObj singletonObj2 = SingletonObj.getInstance();

   singletonObj2.test();

   System.out.println("singletonObj1=>"+singletonObj1.hashCode());

   System.out.println("singletonObj2=>"+singletonObj2.hashCode());

 }

}

结果:

图片

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

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

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

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

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

二、懒汉式

package com.xing.design.singleton;


/**

*  单例模式

* @author xing

*/

public class SingletonObj2 {

//创建 SingletonObj 的一个对象

private static SingletonObj2 instance;

//构造方法私有化

private SingletonObj2(){

   System.out.println("构造个SingletonObj2");

 }

//对外提供访问入口,因为关闭了构造方法,所以只能从这个入口访问本类对象

public static SingletonObj2 getInstance(){

if(instance == null) {

     instance = new SingletonObj2();

   }

return instance;

 }

public void test() {

   System.out.println("单例模式实例化对象的测试方法。。。");

 }

}


测试:

package com.xing.design.singleton;


public class SingletonDemo {

 public static void main(String[] args) {

   SingletonObj2 singletonObj21 = SingletonObj2.getInstance();

   singletonObj21.test();

//再来一个对比下hashCode

   SingletonObj2 singletonObj22 = SingletonObj2.getInstance();

   singletonObj22.test();

   System.out.println("singletonObj21=>"+singletonObj21.hashCode());

   System.out.println("singletonObj22=>"+singletonObj22.hashCode());

 }

}

结果:

图片

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

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

package com.xing.design.singleton;


/**

* 懒汉模式-线程安全,适用于多线程

*/

public class SingletonObj3{

private static volatile SingletonObj3 safeSingleton;//防止指令重排

private SingletonObj3() {

     System.out.println("构造个SingletonObj3");

   }

public static SingletonObj3 getInstance(){

if(safeSingleton==null){

           synchronized (SingletonObj3.class){

if(safeSingleton==null){//双重检测

                   safeSingleton = new SingletonObj3();

               }

           }

       }

return safeSingleton;

   }

public void test() {

   System.out.println("单例模式实例化对象的测试方法。。。");

 }

}

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


总结:

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

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


END

目录
打赏
0
0
0
1
226
分享
相关文章
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
48 2
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
19 4
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
112 13
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
47 2
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
69 4
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
42 1
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等