通俗易懂的java设计模式(1)-单例模式

什么是单例模式?

单例模式是java中最简单的一种设计模式
需要注意的问题:
1.单例类有且只能有一个实例
2.单例类必须自己创建出这个实例,并提供给外界

那么如何自己创建实例而不让外界创建呢?很简单,我们将构造方法定义为private即可

单例模式的优缺点

  • 优点:单例类只有一个实例,从而能避免因为频繁创建和销毁所带来的内存消耗
  • 缺点:与单一职责原则(一个类应该只关心内部逻辑,而不关心外面怎么样来实例化)冲突

简单实现

下面是一个最简单的单例类

public class SingleDemo {
    //自己创建出实例
    private static SingleDemo singleInstance = new SingleDemo();
    //无参的构造方法定义为private,这样就不会被外界实例化
    private SingleDemo(){}
    //将单例提供给外界
    public static SingleDemo getSingleInstance(){
        return singleInstance;
    }

    public void hello(){
        System.out.println("hello world");
    }
}

我们在外界进行简单的调用

public class TestSingle {
    public static void main(String[] args) {
        SingleDemo singleInstance = SingleDemo.getSingleInstance();
        singleInstance.hello();
    }
}

如果我们在外界尝试进行实例化单例类会怎么样?
在这里插入图片描述

懒汉式

懒加载,线程不安全,当第一次用到这个对象时,才创建对象

/**
 * 懒汉式的的简单实现
 */
public class SingleInstance {
    private static SingleInstance singleInstance;
    private SingleInstance(){}

    private static SingleInstance getInstance(){
        if (singleInstance == null){
            singleInstance = new SingleInstance();
        }
        return singleInstance;
    }
}

饿汉式

线程安全,在加载类时,就加载对象

/**
 * 饿汉式的的简单实现
 */
public class SingleInstance {
    private static SingleInstance singleInstance = new SingleInstance();
    private SingleInstance(){}

    private static SingleInstance getInstance(){
        return singleInstance;
    }
}

双重锁

懒加载,线程安全,且在多线程环境下性能高

/**
 * 双重锁的的简单实现
 */
public class SingleInstance {
    private static SingleInstance singleInstance;
    private SingleInstance(){}

    private static SingleInstance getInstance(){
        if (singleInstance == null){
            synchronized (SingleInstance.class){
                if (singleInstance == null){
                    singleInstance = new SingleInstance();
                }
            }
        }
        return singleInstance;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值