Java设计模式(3)-单例模式
单例模式(Singleton Pattern),Java中最简单的设计模式之一,它定义了如何在整个系统范围内仅创建只有单个实例的类。单例模式是一种创建型模式,系统中的类只有一个实例,该类负责自己创建自身的唯一单个实例,并提供一个静态方法来获取自身实例。 1. 单例模式解决的问题 单例模式(Singleton Pattern)的目的是要保证系统中一个类仅有一个实例,并且该类给外部提供一个访问它实例的方法。单例模式旨在解决系统中的类被频繁创建和销毁而占用较多资源的问题。 单例模式不允许外部创建其实例(构造器私有化),而是自身提供给外部一个静态方法来获取其单实例对象。 优点 单例类减小了资源占用,一个类仅有一个实例,内存开销小。 缺点 单例类没有接口,不能继承,与单一职责原则冲突,需要自己关注自身实例创建逻辑。 2. Java中单例模式的8种写法分析 在Java中,单例模式有8八种写法,但是可用的只有几种,我们来分析一下他们的写法和优缺点。 2.1. 饿汉式-静态常量 这种方式利用了类初始化机制,在类初始化时就创建单例实例。 public class AvailableEagerSingleton1 { private static final AvailableEagerSingleton1 INSTANCE = new AvailableEagerSingleton1(); (1) private AvailableEagerSingleton1() { (2) } public static AvailableEagerSingleton1 getInstance() { (3) return INSTANCE; } } 1 静态常量,类初始化时就创建实例 2 构造器私有化,不允许外部直接创建实例 3 提供静态方法给外部调用,以获取其实例 这种方式的优点就是实现起来简单,而且没有线程安全问题,在初始化静态属性时直接创建实例;缺点是,没有实现懒加载,如果类不会被使用,则会存在资源浪费。 如果确定类会被使用,这种方式也是推荐使用的。 2.2. 饿汉式-静态代码块 另一种懒汉式的变体是,使用静态代码块来代替静态属性创建实例,两者其实没有什么根本区别: public class AvailableEagerSingleton2 { private static AvailableEagerSingleton2 INSTANCE; { INSTANCE = new AvailableEagerSingleton2(); (1) } private AvailableEagerSingleton2() { } public static AvailableEagerSingleton2 getInstance() { return INSTANCE; } } ...