吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1516|回复: 2
收起左侧

[Java 转载] 设计模式-单例模式

[复制链接]
崩溃の现充 发表于 2020-7-28 15:12

设计模式-单例模式

定义

单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象。这个类提供了一种访问其唯一的对象方式,可以直接访问,不需要实例化该类的对象

介绍

注意
  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例
意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点

主要解决

一个全局使用的类频繁地创建与销毁

何时使用

当您想控制实例数目,节省系统资源的时候

如何解决

判断系统是否已经有这个单例,如果有则返回,如果没有则创建

关键代码

构造函数是私有的

实现方式

非线程安全的懒汉式
  1. 私有化一个类变量
  2. 私有化构造方法
  3. 判断是否为空,为空就 new ,不为空就直接返回.
public class SluggardUnsafeSingleton {

    private static SluggardUnsafeSingleton sluggardUnsafeSingleton;

    private SluggardUnsafeSingleton() {
    }

    public static SluggardUnsafeSingleton getInstance(){
        if(sluggardUnsafeSingleton == null){
            sluggardUnsafeSingleton = new SluggardUnsafeSingleton();
        }
        return sluggardUnsafeSingleton;
    }

}
线程安全的懒汉式
  1. 私有化一个类变量
  2. 私有化构造方法
  3. 通过 synchronized 对方法进行枷锁。 判断是否为空,为空就 new ,不为空就直接返回.
public class SluggardSafeSingleton {

    private static SluggardSafeSingleton sluggardSafeSingleton;

    private SluggardSafeSingleton() {
    }

    public static synchronized SluggardSafeSingleton getInstance(){
        if (sluggardSafeSingleton == null){
            sluggardSafeSingleton = new SluggardSafeSingleton();
        }
        return sluggardSafeSingleton;
    }

}
饿汉式
  1. 私有化一个类变量,并直接初始化
  2. 私有化构造方法
  3. 直接返回初始化的类变量
public class HungrySingleton {

    private static final HungrySingleton hungrySingleton = new HungrySingleton();

    private HungrySingleton() {
    }

    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
}
双重校验锁(DCL)
  1. 使用 volatile 修饰类变量
    2. 私有化构造方法
    3. 先判断类变量是否为空,不为空直接返回。为空,则用 synchronized 进行加锁,然后实例化。
public class DoubleCheckLockSingleton {

    private static byte[] lcok = new byte[0];

    private volatile static DoubleCheckLockSingleton singleton;

    private DoubleCheckLockSingleton() {
    }
    public static DoubleCheckLockSingleton getInstance(){
        if(singleton == null){
            synchronized (lcok){
                singleton = new DoubleCheckLockSingleton();
            }
        }
        return singleton;
    }
}
静态内部类
  1. 在类里创建一个静态内部类
  2. 静态内部类初始化一个外部类的变量,并用 static final 修饰
    3. 外部类的方法可以直接返回,静态内部类的该变量

使用的是静态内部类的延迟加载

public class InnerClassSingleton {

    private static class SinletonHolder{
        private static final InnerClassSingleton innerClass = new InnerClassSingleton();
    }

    private InnerClassSingleton() {
    }

    public static final InnerClassSingleton getInstance(){
        return SinletonHolder.innerClass;
    }

}

枚举

直接创建枚举,通过枚举类来实现

public enum  EnumSingleton {

    INSTANCE;
    public void whateverMethod(){

    }

}

免费评分

参与人数 3吾爱币 +7 热心值 +3 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
honia_ainoh + 1 + 1 谢谢@Thanks!
葱油拌面 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Ldw 发表于 2020-7-28 19:29
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 02:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表