23种设计模式_MODE01单例模式_手写代码实现

简介: 23种设计模式_MODE01单例模式_手写代码实现

1. 单例模式测试类SingletonTest

package com.zhaoshuangjian.mode01_单例模式;
import com.zhaoshuangjian.mode01_单例模式.mode01.Singleton1;
import com.zhaoshuangjian.mode01_单例模式.mode01.Singleton2;
import com.zhaoshuangjian.mode01_单例模式.mode01.Singleton3;
import com.zhaoshuangjian.mode01_单例模式.mode01.Singleton4;
/**
 * SingletonTest 手写代码实现单例模式
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:07
 */
public class SingletonTest {
    public static void main(String[] args) {
        // 1、单例模式 -- 非线程安全
        Singleton1 singleton1 = Singleton1.getInstance();
        singleton1.show();
        System.out.println("==================分割线==================");
        // 2、单例模式 -- 线程安全,每次获取对象,都对当前的对象加锁
        Singleton2 singleton2 = Singleton2.getInstance();
        singleton2.show();
        System.out.println("==================分割线==================");
        // 3、单例模式 -- 线程安全,只在第一次创建实例对象的时候加锁(推荐)
        Singleton3 singleton3 = Singleton3.getInstance();
        singleton3.show();
        System.out.println("==================分割线==================");
        // 4、单例模式 -- 内部静态工厂类提前创建好实例,JVM保证instance只创建一次,且线程安全(推荐)
        Singleton4 singleton4 = Singleton4.getInstance();
        singleton4.show();
        /**
         * 以上四种单例模式,没有一种是十全十美的
         * 就拿最后一种来说,通过内部类机制达到了线程安全且实例只被创建一次,这些都是JVM帮我们实现的,我们无需关心
         * 但是,如果内部类自己的构造函数出现了问题,而不是在创建instance实例的时候出现了问题
         * 这时候,我们试想一下,我们外部还能顺利拿到单例对象吗?答案是肯定不行
         * 虽然这无疑会增加一道风险,但是相比我们手动加同步块来说,要好的多了
         */
    }
}

2. Singleton1 单例模式-非线程安全

package com.zhaoshuangjian.mode01_单例模式.mode01;
/**
 * Singleton1 单例模式-非线程安全
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:09
 */
public class Singleton1 {
    // 私有构造器,防止外部new实例
    private Singleton1(){}
    private static  Singleton1 instance = null;
    /**
     * 非线程安全,多线程下会有问题【多线程抢资源,谁先抢到呢?会不会出现N个线程拿到的实例不是同一个呢?】
     * @return
     */
    public static Singleton1 getInstance() {
        if (instance == null) {
            instance = new Singleton1();
        }
        return instance;
    }
    public void show(){
        System.out.println("你好,我是单例模式一!");
    }
}

3. Singleton2 单例模式-线程安全(对当前单例对象上锁)

package com.zhaoshuangjian.mode01_单例模式.mode01;
/**
 * Singleton2 单例模式-线程安全(对当前单例对象上锁)
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:12
 */
public class Singleton2 {
    // 私有构造器,防止外部new实例
    private Singleton2(){}
    private static Singleton2 instance = null;
    /**
     * 虽然线程安全,但是每次调用getInstance获得实例的时候,都会对当前的对象进行加锁
     * 注意,是每一次,这样的话多线程环境下性能会有所下降,但是我们知道单例模式的实例是全局只创建一次的
     * 因此,这个锁不应该在每次获取实例的时候加锁,而应该加在第一次创建对象上
     * @return
     */
    public static synchronized Singleton2 getInstance() {
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
    public void show(){
        System.out.println("你好,我是单例模式二!");
    }
}

4.Singleton3 单例模式-线程安全(只在第一次创建实例的时候加锁)

package com.zhaoshuangjian.mode01_单例模式.mode01;
/**
 * Singleton3 单例模式-线程安全(只在第一次创建实例的时候加锁)
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:14
 */
public class Singleton3 {
    // 私有构造器,防止外部new实例
    private Singleton3(){}
    private static Singleton3 instance = null;
    /**
     * 区别于Singleton2,注意synchronized关键字【同步块】的位置
     * @return
     */
    public static  Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class){
                if(instance == null){
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
    public void show(){
        System.out.println("你好,我是单例模式三!");
    }
}

5.Singleton4 单例模式-内部静态工厂类提前创建好实例对象

package com.zhaoshuangjian.mode01_单例模式.mode01;
/**
 * Singleton4 单例模式-内部静态工厂类提前创建好实例对象
 *
 * @Auther: zhaoshuangjian  2023-03-23 下午1:15
 */
public class Singleton4 {
    // 私有构造器,防止外部new实例
    private Singleton4(){}
    private static  class SingletonFactory{
        private static Singleton4 instance = new Singleton4();
    }
    public static  Singleton4 getInstance(){
        return SingletonFactory.instance;
    }
    public void show(){
        System.out.println("你好,我是单例模式四!");
    }
}
相关文章
|
4月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
152 15
|
5月前
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
103 0
|
6月前
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
7月前
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
98 4
|
9月前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
319 13
|
9月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
101 2
|
10月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
134 4
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
71 0