Earth Guardian

You are not LATE!You are not EARLY!

0%

设计模式--创建型:单例模式

单例模式:保证一个类只产生唯一的一个实例,并提供一个访问它的全局访问点

单例模式 Singleton

单例模式一般用于某个类有且仅有一个对象,避免产生多个对象消耗过多资源,或者访问 IO 或数据库等资源时。

类图结构

0051-Singleton-uml-classdiag.png

结构解析

只有一个 Singleton 单例类,这个类有几个关键特点:

  • 构造函数为 private
  • 通过静态方法或者枚举返回单例类对象
  • 确保单例类对象有且仅有一个,特别是多线程场景
  • 单例类在反序列化时不会重构对象

示例

如下是单例模式的经典用法,饿汉式单例:

1
2
3
4
5
6
7
// 饿汉式,static,定义时直接初始化
private static MyObject myObject = new MyObject();

// 使用时,因为在类加载过程中就已经实例化,并发调用安全
public static MyObject getInstance(){
return myObject;
}

多线程中的应用

单例模式在多线程中,有多种实现方式,常见有:饿汉模式,懒汉模式,经典双检锁,枚举实现等。从多线程角度来看,单元素枚举是实现单例模式最佳方法。详细分析参考:Java 多线程并发:单例模式多线程

总结

  • 优点
    单例类封装了它的唯一实例,在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。
  • 缺点
    单例模式中没有抽象层,因此单例类的扩展有很大的困难。单例类的职责过重,在一定程度上违背了“单一职责原则”。单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法。

创建型设计模式总结

创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
创建型模式在创建什么,由谁创建,何时创建等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

参考文档

  • 大话设计模式
  • Android 源码设计模式解析与实战
  • 创建型模式