Java设计模式----单例模式

从今天开始,自己深入研究一下Java的设计模式。设计模式是前人工作的总结和提炼。如果能合理地运用设计模式,不仅使系统更容易被他人理解,同时也能够使系统拥有更加合理结构。单例模式是最常用的设计模式之一,今天就整理一下单例模式的知识。

  • 单例模式的概念
  • 单例模式的好处
  • 单例模式的类图
  • 单例模式的实现

单例模式的概念

单例模式概念: 是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

单例模式的优点

在Java语言中,能带来以下两点好处:

1、对于频繁使用的对象,可以省略创建对象所花的时间,这对于那些重量级的对象而言,是非常可观的提笔开销。

2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减少GC的压力,缩短GC提顿时间。

因此对于系统的关键组件和被频繁使用的对象,使用单例模式便可以有效地改善系统的性能。

单例模式的类图

这里写图片描述

单例模式的实现

第一种实现方法
public class Singleton {
    //私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化
    private Singleton(){

    }
    //instance和getInstance必须是static
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

这种单例的实现方式比较简单,它的不足在于:无法对instance做延迟加载。假如单例的创建过程很慢,而由于instance 成员变量是static定义的,因此JVM加载单例类时,单例就会被创建,如果此时,这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量。

第二种实现方法(加入了延迟加载)
public class LazySinglen {
    //私有化构造函数,这样保证单例不会在系统中的其他代码内被实例化
    private LazySinglen(){

    }
    //instance和getInstance必须是static
    private static LazySinglen instance = null;
    public static synchronized LazySinglen getInstance(){
        if (instance == null){
            instance = new LazySinglen();
        }
        return instance;
    }
}

这种单例模式实现了延迟加载的功能,但是由于引入了同步关键字,使得系统性能降低,有些得不偿失。

第三种实现方法(使用内部类)
public class StaticSingleton {
    private StaticSingleton(){

    }
    private static class SingletonHolder{
        private static StaticSingleton instance = new StaticSingleton();
    }
    public static  StaticSingleton getInstance(){
        return SingletonHolder.instance;
    }
}

使用内部类的方式实现单例,既可以 做到延迟加载,也不必须使用同步关键字,是一种比较完善的做法。(解释:当StaticSingleton被加载时,其内部类不会被初始化,故可以确保当StaticSingleton 类被载入JVM时,不会初始化单例类,而当getInstance()方法被调用时,才会加载内部类,从而初始化instance。由于实例的建立是在类加载时完成的,故对多线程友好,getInstance()也不需要同步关键字。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值