设计模式--单例模式

单例模式

前言

在软件设计中,有时确实存在一个类仅能用来产生一个唯一对象的必要性。例如,一个大公司的打印室虽然可以有多台打印机,但是其打印管理系统中只有一个打印任务控制对象,该对象管理打印排队并分配打印任务给各打印机。再如,在WIndows系统中,应该只有一个文件系统与一个文件管理系统(Windows Manager)。
怎样才能确保一个类只有一个实例?有两种方法解决该问题,一个是程序员在应用程序中使用代码保证仅有一个实例被创建,另外一种方法是不依靠应用程序员,而是精心设计需要仅有一个实例的类,由该类本身的结构确保其仅能够被创建一个实例。实践证明,第二个方法从根本上上保证仅有一个实例被创建的有效方法。这就是单例模式(Singleton Pattern)所要表述的内容。

概念

单例模式(Singleton Pattern),属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)

单例模式是指确保一个类仅有唯一的实例,并且提供一个全局的访问点。

思路

为了防止客户程序利用构造方法创建多个对象,将构造方法声明为private 类型。其原因是,如果构造方法是public 类型的,则客户程序永远可以使用该构造方法创建不同对象。但这样做的问题是,如果一个类的构造方法是private 类型的,其他类就无法使用该构造方法来创建对象,从而该类就成为一个不可用的类。
为了解决这个问题,该类必须提供一个获得实例的方法,通常称为getInstance() 方法。该方法返回一个类的实例。值得注意的是,该方法必须是静态方法,否则客户端将无法调用该方法。应该确保无论客户程序调用该getInstance() 方法多少次,得到的始终是同一个对象。

为了满足上述要求,可将一个希望客户类仅能创建一个实例的类President 设计如下:

public class President {
	private static President instance;
	private String name;
	private President(String name) {
	this.name = name;
	}
	public static Singleton getInstance(String name) {
	if(instance == null&&!name.equals(null))//1
		instance = new President(String name);//2
	return instance;//3
	}
}

以上类的设计保证了仅有一个President 对象被创建。

类设计图

单例模式结构类图:
单例模式结构类图其中,instance是静态变量,类型为Singleton,用于存储已经被创建的实例。getInstance() 为实例构造方法,它创建实例的方式很特别,如果一个实例此前已经被创建了(因而被存储在变量instance中),该方法返回instance;如果此前Singleton 实例没用被创建,则此方法新创建,并返回Singleton 类的一个实例,从而保证实例的唯一性。其他变量与方法是该Singleton 类所涉及的业务所需要的。

介绍

1. 单例模式的优点

  1. 严格控制客户程序访问其唯一的实例。因为单例类封装了其唯一的实例,它可以严格控制在何时客户程序以怎样的方式访问他。
  2. 单例类可以带有一些子类,它的每个子类都是单例类。每个子类有不同的行为,从而使应用客户程序可以在运行时配置不同的子类对象。
  3. 该模式的Singleton 类可以比较容易地改变为允许创建一定数目对象的类。

应用实例

:考虑一个单位的互联网连接问题。该单位对外的互联网使用一个统一的IP地址,所有的内部用户都使用一个统一的内部服务器。当一个用户要连接到互联网上时,该用户应该首先连接到内部服务器上。该连接应该是经过验证的。这里需要设计一个登陆验证系统,以便验证客户信息是否正确。
1. 类设计图
互联网连接系统类图:
在这里插入图片描述2. 代码
代码连接:【例2.6】-单例模式-互联网连接

举世皆浊我独清,众人皆醉我独醒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值