资讯专栏INFORMATION COLUMN

设计模式学习笔记:单例模式

starsfun / 2981人阅读

摘要:一概念一般采用单例模式就是为了满足只创建一个类的需要。单例模式有两个特点一个类仅有一个实例仅有一个全局访问点二写法饿汉式所谓饿汉式,是指这个类的实例在类加载阶段就已经创建出来了。使用在对象被使用时才实例化枚举式

一、概念

一般采用单例模式就是为了满足“只创建一个类”的需要。

单例模式有两个特点:
(1)一个类仅有一个实例
(2)仅有一个全局访问点

二、写法

1、饿汉式
所谓饿汉式,是指这个类的实例在类加载阶段就已经创建出来了。

public class Singleton1 {
    //在类的内部实例化一个实例
    private static final Singleton1 instance = new Singleton1();
    //隐藏构造方法
    private Singleton1() {
    }
    //对外开放一个获取实例的方法
    public static  Singleton1 getInstance(){
        return instance;
    }
}

当然也可以使用static代码块。(注意这里的final,看网上有各种写法,加或者不加的都有,我认为这里可以加,这样getInstance方法里就不需要判空了)

这种方式虽然能够有效避免线程安全的问题,但是却可能造成不必要的浪费,因为也许这个实例并不需要用到,或者就用到一两次,却要一直占用内存。

2、静态内部类

public class InnerClassSingleton {
    //在静态内部类中实例化对象
    private static class SingletonHolder{
        private static final InnerClassSingleton instance = new InnerClassSingleton();
    }
    //隐藏构造方法
    private InnerClassSingleton(){
    }
    //对外提供访问方法
    public static final InnerClassSingleton getInstance() {
        return SingletonHolder.instance;
    }
}

3、懒汉式
所谓懒汉式,就是在使用时才加载,比较“懒一些”。

public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){
    }
    public static Singleton2 getInstance(){
        //在对象被使用时才实例化
        if (instance == null)
            instance = new Singleton2();
        return instance;
    }
}

注意:加上synchronized关键字就可以保证线程安全。

public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){
    }
    public static synchronized Singleton2 getInstance(){
        //在对象被使用时才实例化
        if (instance == null)
            instance = new Singleton2();
        return instance;
    }
}

4、当然上述方式效率比较低,因为synchronized锁的范围太大了

public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){
    }
    public static Singleton2 getInstance(){
        //在对象被使用时才实例化
        synchronized (Singleton2.class){
            if (instance == null)
                instance = new Singleton2();
            return instance;
        }
    }
}

这样就缩小了锁的范围,但是这种方式依然存在问题,因为Java内存模型的机制,程序可能会崩溃,因此就要用到volatile。

5、使用volatile

public class Singleton2 {
    private static volatile Singleton2 instance;
    private Singleton2(){
    }
    public static Singleton2 getInstance(){
        //在对象被使用时才实例化
        if (instance == null){
            synchronized (Singleton2.class){
                if (instance == null)
                    instance = new Singleton2();
                return instance;
            }
        }
    }
}

6、枚举式

public enum  Singleton3 {
    INSTANCE;
    Singleton() {
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75285.html

相关文章

  • javascript设计模式学习笔记单例模式

    摘要:单例模式单例模式就是保证一个类仅有一个实例并提供一个访问它的全局访问点其最大的特点就是永远只返回一个实例实例通过来获取类的唯一对象其缺点也明显增加了类的不透明性透明的单例模式最终会被返回使用代理实现单例模式将负责管理单例的逻辑移到了代理类中 单例模式 单例模式 就是保证一个类仅有一个实例, 并提供一个访问它的全局访问点. 其最大的特点就是 永远只返回一个实例 var Sin...

    xiaolinbang 评论0 收藏0
  • (CZ深入浅出Java基础)设计模式笔记

    摘要:在设计模式中,所有的设计模式都遵循这一原则。其实就是说在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。使用设计模式是为了可重用代码让代码更容易被他人理解保证代码可靠性。 这是刘意老师的JAVA基础教程的笔记讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一、面向对象思想设计原则 1.单一职责原则 其实就是开发人员经常说的高...

    李昌杰 评论0 收藏0
  • 设计模式笔记python实现

    摘要:设计模式学习装饰器模式这个在我的笔记中有介绍工厂模式未完成,待更新单例模式保证一个对象最多只有一个实例存在。对安全性要求较高的场景,比如银行的修改余额业务。如果我们不使用单例模式,那么就会创建三个不同的实例。 设计模式学习 1.装饰器模式 这个在我的笔记中有介绍 2.工厂模式 author : liibntime :2018-11-6未完成,待更新 3.单例模式 保证一个对象最多只有一...

    raledong 评论0 收藏0
  • 设计模式学习笔记(一)【Singleton、Adapter、Iterator 、Prototype

    摘要:今天上课的时候老师开始讲个设计模式,为加深印象,特开一篇文章来做记录。其中参考大话设计模式以及上课的例子,后期会补充关于的应用保证一个类仅有一个实例。单例是有状态的,允许子类继承,拥有唯一的对象实例。原始对象与副本引用同一对象。 今天上课的时候老师开始讲23个设计模式,为加深印象,特开一篇文章来做记录。其中参考《大话设计模式》以及上课的例子(java),后期会补充关于js的应用 ...

    FreeZinG 评论0 收藏0
  • 设计模式学习笔记(一)【Singleton、Adapter、Iterator 、Prototype

    摘要:今天上课的时候老师开始讲个设计模式,为加深印象,特开一篇文章来做记录。其中参考大话设计模式以及上课的例子,后期会补充关于的应用保证一个类仅有一个实例。单例是有状态的,允许子类继承,拥有唯一的对象实例。原始对象与副本引用同一对象。 今天上课的时候老师开始讲23个设计模式,为加深印象,特开一篇文章来做记录。其中参考《大话设计模式》以及上课的例子(java),后期会补充关于js的应用 ...

    liuchengxu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<