首页 > 其他分享 >单例模式

单例模式

时间:2023-03-12 17:45:06浏览次数:26  
标签:private 实例 static 模式 单例 class

常见设计模式

工厂模式,代理模式,模板方法模式,责任链模式,单利模式

项⽬⼿写代码⽤得⽐较多的,⼀般就模板⽅法模式、责任链模式、策略模式、单例模式吧

 

单例模式

即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。

如:代表 JVM 运行环境的 Runtime 类

 

要点

1)某个类只能有一个实例(构造器私有化) 2)它必须自行创建实例(​ 含有一个该类的静态变量来保存这个唯一的实例) 3)它必须自行向整个系统提供这个实例(对外提供获取该类实例对象的方式直接暴露,用静态变量声明的方法获取)

 

优点

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景

  • 要求生产唯一序列号。
  • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

实现

饿汉式

 

public class Single {
    // 饿汉式:直接实例化
    private static Single single = new Single();
    // 构造私有
    private Single(){}

    public static Single getinstance(){
        return single;
    }
}

 

简单懒汉式

/**
 * 简单懒汉式 方法加锁
 */
class Single2{
    
    private static Single2 single2 = null;

    private Single2() {
    }
    // 需要的时候才会初始化
    public static synchronized Single2 getinstance(){
        if(single2 == null){
            single2 = new Single2();
        }
        return single2;
    }
}

DCL双重检验加锁(进阶懒汉式)

 

/**
 * DCL懒汉式
 */
class Single3{
    /**
     * volatile 防止指令重排导致线程不安全
     */
    private static volatile Single3 single3 = null;

    public Single3() {
    }
    public static Single3 getinstance() {
        if(single3 == null) {
            synchronized (Single3.class) {
                if (single3 == null) {
                    single3 = new Single3();
                }
            }
        }
        return single3;
    }
}

 

静态内部类(优雅懒汉式)

 

/**
 * 静态内部类 懒汉式
 */
class Single4 {
    private Single4(){}
    //使用静态内部类的方式实现懒加载(一定线程安全)
    private static class LazyHolder{
        private static final Single4 singleton = new Single4();
    }
    public static final Single4 getInstance() {
        return LazyHolder.singleton;
    }
}

 

枚举

 

/**
 * 枚举
 */
enum Single5{
    /**
     * 单例
     */
    SINGLETON
}

 

标签:private,实例,static,模式,单例,class
From: https://www.cnblogs.com/deity-night/p/17119414.html

相关文章

  • 设计模式(二十)----行为型模式之责任链模式
    1、概述在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,......
  • 设计模式之单例模式
    Java中的单例模式(SingletonPattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。实现单例模式通常有两种方式:懒汉式和饿汉式。懒汉式单例模式是......
  • Java 建造者模式/链式调用 简单Demo
    最近,公司同事要求我给他们讲一下RxJava,为了更清晰的说明其架构,.简单写了一个链式调用的小Demo,分享给大家/**作者:赵星海(CSDN-深海呐)*时间:2019年3月19日16:56:32*......
  • Java 关于单例模式(懒汉式与饿汉式的区别)
             Java关于单例模式(懒汉式与饿汉式的区别)简单说下两个单例模式的不同点懒汉式:1.内部对象非final类型2.线程安全3.用到特定方法的时候才会实例......
  • 单例bean与原型bean的区别
    在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,globalsession。上图为各个scope描述的官方文档截图。Spring在一开始的时候只提供了s......
  • 从代码层面来讲,何时使用设计模式
    1工厂模式想通过名称获取对象2抽象工厂模式单个工厂不满足对象的生产3单例模式全局只有一个对象4建造者模式通过构造函数创建对象不方便,例如,构造函数参数太多5原型模式......
  • 设计模式(十九)----行为型模式之命令模式
    1、概述日常生活中,我们出去吃饭都会遇到下面的场景。定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方......
  • 前端设计模式——策略模式
    在前端开发中,策略模式是一种常用的设计模式,它可以让我们在不改变对象本身的情况下,通过修改其内部的算法实现不同的行为。策略模式常常被用于实现一些复杂的业务逻辑,特别是......
  • 单例
    单例(一个脚本调另一个脚本里的变量或方法)示例//待调用的代码usingUnityEngine; publicclassJuse:MonoBehaviour{publicstaticJusem_Instance;    voi......
  • angular onpush模式下优先使用markForCheck手动标记为脏属性并调用检测更新
    import{ChangeDetectorRef,Component,Input,ChangeDetectionStrategy,SimpleChanges}from'@angular/core';@Component({selector:'app-change-grandson',te......