美文网首页
创建型-单例模式

创建型-单例模式

作者: 程序男保姆 | 来源:发表于2020-04-24 11:05 被阅读0次
  • 定义
  • 意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
  • 主要解决
一个全局使用的类频繁地创建与销毁。
  • 何时使用
当您想控制实例数目,节省系统资源的时候。
  • 如何解决
判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
  • 关键代码
构造函数是私有的。
  • 优点

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

  • 缺点

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

类图


/***
 * 懒汉模式
 *
 * 1 volatile 此处保证内存可见性
 * 2 synchronized 保证同一时间 只有一个线程访问 getLazySingleton() 方法
 *
 */
public class LazySingleton {

    private static volatile LazySingleton lazySingleton;

    private LazySingleton(){};

    public static synchronized LazySingleton getLazySingleton(){
        if (lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}



/***
 * 饿汉模式
 *
 * 对象在初始化时被创建在方法区中
 *
 */
public class HungrySingleton {

    private static HungrySingleton hungrySingleton;

    static {
        hungrySingleton = new HungrySingleton();
    }

    public static HungrySingleton getHungrySingleton(){
        return hungrySingleton;
    }

    private HungrySingleton (){}

}



/***
 * 双重检测模式
 *
 * 1 volatile 此处保证内存可见性 指令冲排序
 * 2 synchronized 保证同一时间 只有一个线程访问
 * 3 第一个if doubleCheckSingleton == null 避免多线程下同时阻塞到 synchronized
 * 4 第二个if 主要避免多个线程同时拿到锁到情况下创建单一实例
 *
 */
public class DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton doubleCheckSingleton;

    private DoubleCheckSingleton(){}

    public static DoubleCheckSingleton getDoubleCheckSingleton(){
        if (doubleCheckSingleton == null){
            synchronized (DoubleCheckSingleton.class){
                if (doubleCheckSingleton == null){
                    doubleCheckSingleton = new DoubleCheckSingleton();
                }
            }
        }
        return doubleCheckSingleton;
    }


}



/***
 * 枚举模式 实现单例
 *
 * 1 可以防止序列化创建多个实例
 * 2 可以防止反射创建多个实例
 *
 */
public enum  EnumSingleton {
    INSTANCE( );
    private S instance;

    EnumSingleton() {
        instance = new S();
    }

    public S getInstance() {
        return instance;
    }
}

class S{

}
  • 其他模式
  1. ThreadLocal 方法实现
  2. 容器实现

相关文章

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 2.架构设计(单例模式设计)

    1.设计模式分为三个类 创建型 结构型 行为型 2.创建型:单例模式 为什么用单例模式?如果你看到这个问题,你怎么...

  • 【设计模式】创建型设计模式汇总

    创建型设计模式汇总 1. 单例模式 1.1 单例模式的定义 一个类只允许创建一个对象或实例。 1.2 单例模式的作...

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 23种设计模式学习总结

    创建型设计模式 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码合使用代码。 单例模式 单例模式用来...

  • S4. 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个...

  • Python 之单例模式

    简介:单例模式(Singleton Pattern) 是最简单的设计模式之一,属于创建型的设计模式。单例模式涉及到...

  • iOS架构探究--单例模式

    设计模式分为三大类:创建型、结构性、行为型。单例模式就属于创建类。 1.为什么用单例模式? 由开发者的编程习惯...

  • “Python的单例模式有四种写法,你知道么?”——孔乙己

    什么是单例模式 单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

网友评论

      本文标题:创建型-单例模式

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