设计模式-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

目录
相关文章
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
29 2
|
9天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
23 4
|
18天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
21小时前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
26天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
18 1
|
8天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
18 0
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
1月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
33 1
|
1月前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
1月前
|
设计模式 存储 测试技术
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发领域,设计模式是解决常见问题的最佳实践。本文将深入探讨单例模式,一种确保类只有一个实例的设计模式,并提供实际应用示例。我们将从单例模式的基本概念讲起,通过实际案例展示如何在PHP中实现单例模式,以及它在不同场景下的应用和优势。最后,我们会探讨单例模式的优缺点,帮助开发者在实际项目中做出明智的选择。