设计模式学习--单例模式

设计模式学习–单例模式

二十三种设计模式是软件开发中十分重要的思想,也是面试中常问的点,因此很有必要进行深入的学习。本次博客也将对每个模式进行学习和分享,有问题的地方欢迎大家指出。


单例模式

Ensure a class has only one instance, and provide a global point of access to it.

单例模式(Single Pattern)是一个简单而常见的模式,它保证一个类只有一个实例,并且是自行实例化的,代码如下:

/**
 * 单例类
 * @Description:
 * @author:wws
 * @time:2018年8月15日 下午8:11:22
 */
public class Singleton {

    private static final Singleton singleton = new Singleton();

    // 使用private的构造函数确保应用中无法再产生实例
    private Singleton(){}

    // 获取实例的方法
    public static Singleton getSingleton(){
        return singleton;
    }

    // 其他方法尽量为static
    public static void doSomething(){

    }
}

优点

1.整个系统只有一个实例,内存占用小
2.代码结构简单、清晰

缺点

单例模式一般没有接口,扩展困难

应用

当在一个系统中,一个类仅需要一个对象,就可以使用单例模式。这也是Spring中默认使用的,这样Spring可以管理这个Bean的生命周期,而使用了非单例模式,Bean就交由J2EE容器管理。

注意点

单例模式是设计模式中一个十分基础且常用的模式,面试一般问的更多的是饿汉、懒汉模式,这里将附上代码说明:

/**
 * 饿汉
 * @Description:
 * @author:wws
 * @time:2018年8月16日 上午11:14:58
 */
public class SingleHungry {

    // 默认开始就创建一个实例
    private static SingleHungry singleHungry = new SingleHungry();

    // 使用private禁止创建新实例
    private SingleHungry(){}

    // 获取实例
    public static SingleHungry getInstance(){
        return singleHungry;
    }
}
/**
 * 懒汉
 * @Description:
 * @author:wws
 * @time:2018年8月16日 上午11:18:42
 */
public class SingleLazy {

    // 默认为null,需要使用时,再创建实例
    private static SingleLazy singleLazy = null;

    private SingleLazy(){}

    /**
     * @Description:使用时判断singleLazy是否为空,不为空返回对象,为空新建;
     *              但是可能会有并发问题,需要加上synchronized
     * @return
     * SingleLazy
     * @exception:
     * @author: wws
     * @time:2018年8月16日 上午11:21:17
     */
    public static synchronized SingleLazy getInstance(){
        return Optional.ofNullable(singleLazy).orElse(new SingleLazy());
    }
}

实际项目中,推荐使用的是饿汉模式,即使懒汉模式加了synchronized保证线程安全,但还是会带来一部分内存消耗。


参考书籍:
《设计模式之禅》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值