首页 > 其他分享 >24种设计模式之单例模式(singleton)

24种设计模式之单例模式(singleton)

时间:2023-01-28 23:23:00浏览次数:43  
标签:24 singleton PersonTest2 PersonTest3 PersonTest INSTANCE static 设计模式 public

24种设计模式之单例模式(singleton)

目录

饿汉模式:推荐使用

package com.dahan;

/**
 * 饿汉式:推荐使用
 * 简单使用  JVM堆内存中种只有一个线程安全
 */
public class PersonTest {
    private static final PersonTest INSTANCE = new PersonTest();

    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest(){

    }

    public static PersonTest getInstance() {
        return INSTANCE;
    }

    public void m(){
        System.out.println("单例饿汉模式");
    }
    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        PersonTest instance1 = PersonTest.getInstance();
        PersonTest instance2 = PersonTest.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);// true
    }

}

懒汉模式:不推荐

  1. 按需加载,不占用过多内存
  2. 需要处理线程不安全
  3. 加锁线程钱安全,但效率低
package com.dahan;

/**
 * 懒汉式:不推荐
 * 效率低 需要处理线程不安全
 */
public class PersonTest2 {
    private static PersonTest2 INSTANCE = null;

    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest2(){

    }

    public static PersonTest2 getInstance() {
        if(INSTANCE == null){
            // 双重检查
            synchronized (PersonTest2.class){
                if(INSTANCE == null){
                    INSTANCE = new PersonTest2();
                }
            }
        }
        return INSTANCE;
    }

    public void m(){
        System.out.println("单例懒汉模式");
    }
    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        PersonTest2 instance1 = PersonTest2.getInstance();
        PersonTest2 instance2 = PersonTest2.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}

静态内部类模式:推荐 最完美的方式

package com.dahan;

/**
 * 静态内部类模式:推荐使用 最完美的方式
 * 简单使用  JVM堆内存中种只有一个线程安全
 */
public class PersonTest3 {
    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest3() {

    }

    /**
     * 静态内部类
     */
    private static class PersonTest3Holder {
        private final static PersonTest3 INSTANCE = new PersonTest3();
    }

    public static PersonTest3 getInstance() {
        return PersonTest3Holder.INSTANCE;
    }

    public void m() {
        System.out.println("m");
    }

    /**
     * 测试方法
     *
     * @param args
     */
    public static void main(String[] args) {
        PersonTest3 instance1 = PersonTest3.getInstance();
        PersonTest3 instance2 = PersonTest3.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}

java之父推荐:解决线程同步、反序列化解决等问题

package com.dahan;

/**
 * java之父推荐:解决线程同步、反序列化解决等问题
 */
public enum PersonTest4 {
    INSTANCE;

    public void m() {
        System.out.println("m");
    }

    /**
     * 测试方法
     *
     * @param args
     */
    public static void main(String[] args) {
        PersonTest4 instance1 = PersonTest4.INSTANCE;
        instance1.m();
        PersonTest4 instance2 = PersonTest4.INSTANCE;
        instance2.m();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}

标签:24,singleton,PersonTest2,PersonTest3,PersonTest,INSTANCE,static,设计模式,public
From: https://www.cnblogs.com/csh520mjy/p/17071505.html

相关文章

  • 跟我学Java设计模式第7天:行为型设计模式
    Java设计模式文章目录​​跟我学Java设计模式第一天:设计模式概述和软件设计原则​​​​跟我学Java设计模式第二天:简单工厂模式、工厂方法模式、抽象工厂模式​​​​跟我学......
  • LTC2440串行SPI通讯时序
    LTC2440简介我们使用4-wireSPI接口按照时序图上的描述,SDO是在SCLK的下降沿更新数据,那么FPGA接收端就应该在上升沿采集数据。实际测试发现SDO数据相对于SCLK延迟了6......
  • Ubuntu 20.24 安装Postgresql 14
      1.运行环境WSL+Ubuntu20.04   2.安装Postgresql进入Linux命令行,参照Postgresql官网安装指南#Createthefilerepositoryconfiguration:sudo......
  • Go-24 golang命令行初始
    packagemainimport( "flag" "fmt" "os")//golang命令行初识;可以后面多多了解一下强大的命令行工具cobra//cobra工具推荐了解的地址:https://blog.csdn.net/qq......
  • 【设计模式】结构型
    装饰者模式组合的方式扩展类。符合开闭原则外观模式隐藏子系统接口,提供统一对外服务接口。符合迪米特法制(最少知道原则)代理模式使用代理对象控制对原对象的访问,降低系......
  • 设计模式
    设计模式的六大原则1、开闭原则(OpenClosePrinciple)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言......
  • 刷刷刷 Day 24 | 77. 组合
    77.组合LeetCode题目要求给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。你可以按任何顺序返回答案。示例输入:n=4,k=2输出:[[2,4],[......
  • 浅谈PHP设计模式的访问者模式
    简介:访问者模式,属于行为型的设计模式。表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。适用场景:类中......
  • 2469
    给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度,以 摄氏度(Celsius)为单位。你需要将摄氏度转换为 开氏度(Kelvin)和 华氏度(Fahrenheit),并以数组 ans=[kel......
  • 2413
    给你一个正整数 n ,返回 2 和 n 的最小公倍数(正整数)。输入:n=6输出:6解释:6和2的最小公倍数是6。注意数字会是它自身的倍数。classSolution(object):d......