1 基础知识
1.1 标准定义
单例模式标准定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1.2 分析和说明
单例模式属于创建型模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且其它类可以通过某种方法访问该实例。单例模式只应在有真正的“单一实例”的需求时才可使用。Singleton结构如图1所示。单例模式只有一个角色,就是要进行单例的类。
图1 单例模式结构
2 应用场景举例
比如公司规定,一个市场用户只能由一个市场人员跟踪。最初用户联系公司的时候,任命一个市场人员负责这个用户。以后这个用户再继续联系公司,全部统一由指定的这个市场人员来负责。用例见图2。
图2 单例模式的用例图
在这里可以把SaleMan就是一个要求单例的类,ServiceManager是一个提供单例方法的类。其实现类图见图3。
图3 单例模式的类图
单例模式实现的顺序图如图4所示,实现顺序描述:
①创建一个销售员实例对象;
②创建一个服务实例对象;
③最初向服务对象要求服务;
④返回销售员实例对象。
⑤多次向服务对象提出服务,返回同一个销售员实例对象;
图4 单例模式实现顺序图
3.Java的实现程序代码
Java程序实现主要包括ServiceManager类文件和SaleMan类文件。其关系如图3所示。下面分别列出这2个文件的程序代码,最后列出测试代码并显示输出结果。
ServiceManager类文件程序代码清单01所示。
程序代码清单01
public class ServiceManager { private SaleMan saleMan = null; public ServiceManager(SaleMan saleman) { this.saleMan = saleman; } public SaleMan getSaleManService() { return saleMan; } } |
SaleMan类文件程序代码清单02所示。
程序代码清单02
public class SaleMan { private String name; private String service; public SaleMan(String name, String service) { this.name = name; this.service = service; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getService() { return service; } public void setService(String service) { this.service = service; } } |
单例模式测试程序的代码清单03如下:
程序代码清单03
public class Client { public static void main(String[] args) { SaleMan saleMan = new SaleMan("小刘", "小刘的服务"); ServiceManager service = new ServiceManager(saleMan); System.out.print("第一次获得服务:"); SaleMan saleman = service.getSaleManService(); System.out.println(saleman.getService()); System.out.print("第二次获得服务:"); saleman = service.getSaleManService(); System.out.println(saleman.getService()); System.out.print("第三次获得服务:"); saleman = service.getSaleManService(); System.out.println(saleman.getService()); } } |
单例模式测试类输出结果如下所示:
第一次获得服务:小刘的服务 第二次获得服务:小刘的服务 第三次获得服务:小刘的服务 |
6 扩展和说明
单例模式也是应用非常广泛的设计模式。单例模式有两种实现方式,一种叫懒汉式单例模式,另一中叫饿汉式单例模式。
懒汉式单例模式表示当外部需要对象,才去查找是否有对象,如果有,就返回该对象;如果没有,那就创建一个并返回对象,java实现代码如程序代码清单06所示。
程序代码清单06
public class Singleton { private static Singleton instance = null; public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } |
饿汉式单例模式表示当不管外部是否需要对象,只要类加载就提供出来实例对象,java实现代码如程序代码清单07所示。
程序代码清单07
public class Singleton { private static Singleton instance = new Singleton (); public static Singleton getInstance(){ return instance; } } |
参考链接
5种创建型模式:
Gof23种设计模式(1)——工厂模式(Factory Method)
Gof23种设计模式(2)——抽象工厂模式(Abstract Factory)
Gof23种设计模式(3)——建造模式(Builder)
Gof23种设计模式(4)——原型模式(Prototype)
Gof23种设计模式(5)——单例模式(Singleton)
Gof23种设计模式 —— 创建型模式总结和比较
回到总目录:Gof23种设计模式(全解析)
(转载自微信公众号:架构设计模式)