单例模式

什么是Singleton?

单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。
例如:代表JVM运行环境的Runtime类。

要点

  • 一是某个类只能有一个实例
    构造器私有化
  • 二是它必须自行创建这个实例
    含有一个该类的静态变量来保存这个唯一的实例
  • 三是它必须自行向整个系统提供这个实例
    对外提供获取该实例对象的方式

(1)饿汉式:直接创建对象,不存在线程安全问题

  • 直接实例化饿汉式
  • 枚举式
  • 静态代码块饿汉式

(2)懒汉式:延迟创建对象

  • 线程不安全(只适用于单线程)
  • 线程安全
  • 静态内部类形式
/**
 * 饿汉式:
 * 直接创建实例对象,不管你是否需要这个对象
 *
 * (1)构造器私有化
 * (2)自行创建,并且用静态变量保存
 * (3)向外提供这个实例
 * (4)强调这是一个单例,我们可以用final修改
 */
public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1(){}
}

/**
 * 枚举类型:表示该类型的对象是有限的几个
 * 我们可以限定为一个,就成了单例
 */
public enum Singleton2 {
    INSTANCE
}

/**
 * 静态代码块
 * 适合复杂实例化
 */
public class Singleton3 {
    public static final Singleton3 INSTANCE;

    static {
        INSTANCE = new Singleton3();
    }

    private Singleton3(){}
}

/**
 * 懒汉式
 * 延迟创建这个实例对象
 *(1)构造器私有化
 *(2)用一个静态变量保存这个唯一的实例
 *(3)提供一个静态方法,获取这个实例对象
 */
public class Singleton4 {
    private static Singleton4 instance;
    private Singleton4(){

    }
    public static Singleton4 getInstance(){
        if(instance == null){
            instance = new Singleton4();
        }
        return instance;
    }
}

/**
 * 懒汉式(线程安全)
 * 延迟创建这个实例对象
 *(1)构造器私有化
 *(2)用一个静态变量保存这个唯一的实例
 *(3)提供一个静态方法,获取这个实例对象
 */
public class Singleton5 {
    private static Singleton5 instance;
    private Singleton5(){

    }
    public static Singleton5 getInstance(){
        if(instance == null){
            synchronized (Singleton5.class){
                if(instance == null){
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}

/**
 * 在内部类被加载和初始化时,才创建INSTANCE实例对象
 * 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。
 */
public class Singleton6 {
    private static Singleton6 instance;
    private Singleton6(){

    }
    private static class Inner{
        private static final Singleton6 INSTANCE = new Singleton6();
    }

    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }
}
(0)

相关推荐

  • 面试高频-吃透单例设计模式

    单例设计模式 单例设计模式的介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法). 比如 Hiber ...

  • 设计模式(一)——Java单例模式(代码+源码分析)

    设计模式(一)——Java单例模式(代码+源码分析)

  • java常见设计模式之---单例模式

    java常见设计模式之---单例模式 1.单例模式简介 应用场景举例 2.单例模式的特点 3.单例模式和静态类 4.单例模式的经典实现 饿汉式单例(典型实现) 饿汉式-静态代码块 懒汉式单例创建,五种 ...

  • C#(九)基础篇—静态成员与异常处理

    C# 本随笔为个人复习巩固知识用,多从书上总结与理解归纳得来,如有错误烦请指正  静态成员 在定义类的成员属性或方法时加上static,即表示它是一个静态成员,静态成员不能被类的对象引用,值被所有对象 ...

  • 设计模式之单例模式(Singleton Pattern)

    一.定义 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 二.单例模式举例 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各 ...

  • 学习单例模式引发的思考

    单例存在哪里问题? 1.单例对oop的支持不友好 OOP 四大特性: 封装 继承 多态 抽象 而单例这种设计模式对于其中的抽象 继承 多态 都支持的不好 为什么这么说呢? 我们先来看一个单例的例子 p ...

  • [软技能] 第99天 你有用过单例模式吗?主要运用场景有哪些?

    今日试题: 你有用过单例模式吗?主要运用场景有哪些? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前 ...

  • 【1/25】将Game改写为单例模式(Singleton Pattern)

    这是<小游戏从0到1设计模式重构>系列内容第1篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. Game的实例在游戏时只有一个 ...

  • 初级必备:单例模式的7个问题

    故事 实话实说,关于单例模式,网上有N多个版本.你估计也看过很多版本.但看完了又能怎样?我技术群里的一位小伙伴,上周面试,就因为一个单例模式,然后叫他回去等通知了. 下面是这位同学被问到的问题: 1. ...

  • PHP设计模式之单例模式

    PHP设计模式之单例模式 单例模式绝对是在常用以及面试常问设计模式中排名首位的.一方面它够简单,三言两语就能说明白.另一方面,它又够复杂,它的实现不仅仅只有一种形式,而且在Java等异步语言中还要考虑 ...

  • [PHP小课堂]PHP设计模式之单例模式

    [PHP小课堂]PHP设计模式之单例模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式-单例模式

    单例模式 优点 由于单例模式在内存中只有一个实例,减少了内存开支,特别是 一个对象需要频繁地创建.销毁时,而且创建或销毁时性能又无法优 化,单例模式的优势就非常明显. 由于单例模式只生成一个实例,所以 ...