美文网首页
逸笔记-设计模式-单例模式

逸笔记-设计模式-单例模式

作者: lovefy | 来源:发表于2023-02-14 10:25 被阅读0次

1.什么是单例模式

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例),就好比有一口井,只需要一个桶就可以打水上来了,不需要额外的桶来进行打水操作。这就是单例模式

2.单例模式有哪些设计方式

单例模式,主流的设计方式有两种,一种是懒汉,另一种是饿汉。其中懒汉模式,顾名思义,就是比较懒在代码初始化的时候就生成一个唯一实例给你,就像我们去井李打水,懒汉模式就是比较懒,井建好的时候,需要打水的时候采取买一个桶去打水。饿汉模式,就如其名,很饿了,狠不得立马去吃饭那种,就像井建好了以后,立马买一个桶,不管有没有打水的需求。所以我们根据这些特点,来写代码

1.懒汉模式

package cn.com.lovefy.demo;

/**
* @author lyf
*/
public class LazyOneDemo {
    private static volatile LazyOneDemo lazyOneDemo;
    //不允许对象被实例化
    private LazyOneDemo(){
    }
    /**
* 获取实例
* @return {@link LazyOneDemo}
*/
    public static LazyOneDemo getInstance() {
        if(lazyOneDemo!=null){
            synchronized (LazyOneDemo.class){
                if(lazyOneDemo!=null) {
                    lazyOneDemo = new LazyOneDemo();
                }
            }
        }
        return lazyOneDemo;
    }

}

特点:延时加载,只有在正在需要的时候才开始实例化。
1、线程安全问题
2、双重判断double check,加锁优化(锁也可以直接加锁到方法上,但是会耗费性能)
3、使用volatile关键字,防止指令重排序

2.饿汉模式

package cn.com.lovefy.demo;

/**
* @author lyf
*/
public class HunglyOneDemo {
    private static  HunglyOneDemo hunglyOneDemo = new HunglyOneDemo();
    //不允许对象被实例化
    private HunglyOneDemo(){
    }
    /**
* 获取实例
* @return {@link HunglyOneDemo}
*/
    public static HunglyOneDemo getInstance() {
        return hunglyOneDemo;
    }

}

特点:类加载的初始化阶段就完成了实例的初始化,本质上是借助于jvm的类加载机制,保证实例的唯一性。(急加载)
类加载机制:
1、加载:加载二进制文件到内存中,并生成对应的class数据结构
2、连接:包括验证、准备(给静态变量赋默认值,引用类型为null,int为0,boolean为false等等)、解析(将符号应用替换为直接引用)
3、初始化(执行静态代码块、给静态变量赋初值)
注意:如果当前类的父类没有被加载,则会先加载父类

3.其他单例的实现

1.内部静态类的实现

class InnerOneDemo {
    private static class InnerOneDemoHolder {
        private static InnerOneDemo innerOneDemo= new InnerOneDemo();
    }
    //不允许被实例化
    private InnerOneDemo(){
    }
    /**
    * 获取实例
    * @return {@link InnerOneDemo}
    */
    public static InnerOneDemo getInstance() {
        return InnerOneDemoHolder.innerOneDemo;
    }
}

特点:也是借助jvm的类加载机制,保证实例的唯一性(懒加载)
当访问instance时才会初始化实例
缺点:可以通过反射进行破坏
2.枚举的形式实现

package com.demo.Enum;

/**
* @BelongsProject: demo
* @BelongsPackage: com.demo.Enum
* @Author: liyifan
* @CreateTime: 2023-02-13 09:56
* @Description: 枚举单例模式
*/
public enum OneEnum {
    ONE;

    public static OneEnum getInstance(){
        return ONE;
    }
}

特点:简单,线程安全,也能够防护反射攻击(禁止反射实例化enum类型类)。

相关文章

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • 逸笔记-设计模式-单例模式

    1.什么是单例模式 单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

网友评论

      本文标题:逸笔记-设计模式-单例模式

      本文链接:https://www.haomeiwen.com/subject/qvqdkdtx.html