Gof23种设计模式(5)——单例模式(Singleton)

2020年8月6日14:35:44 评论 77

1 基础知识

1.1 标准定义

单例模式标准定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.2 分析和说明

单例模式属于创建型模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且其它类可以通过某种方法访问该实例。单例模式只应在有真正的“单一实例”的需求时才可使用。Singleton结构如图1所示。单例模式只有一个角色,就是要进行单例的类。

Gof23种设计模式(5)——单例模式(Singleton)

图1 单例模式结构

2 应用场景举例

比如公司规定,一个市场用户只能由一个市场人员跟踪。最初用户联系公司的时候,任命一个市场人员负责这个用户。以后这个用户再继续联系公司,全部统一由指定的这个市场人员来负责。用例见图2。

Gof23种设计模式(5)——单例模式(Singleton)

图2 单例模式的用例图

在这里可以把SaleMan就是一个要求单例的类,ServiceManager是一个提供单例方法的类。其实现类图见图3。

Gof23种设计模式(5)——单例模式(Singleton)

图3 单例模式的类图

单例模式实现的顺序图如图4所示,实现顺序描述:
①创建一个销售员实例对象;
②创建一个服务实例对象;
③最初向服务对象要求服务;
④返回销售员实例对象。
⑤多次向服务对象提出服务,返回同一个销售员实例对象;

Gof23种设计模式(5)——单例模式(Singleton)

图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种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月6日14:35:44
  • 转载请注明:https://www.suketech.com/8798.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: