菜鸟学设计模式系列笔记之单例设计模式(Singleton模式)

特殊的类:

(1)类和它的实例间一般是一对多的关系。对大多数的类而言,都可以创建多个实例。

在需要这些实例时创建它们,在这些实例不再有用时删除它们。这些实例的来去伴随着内存的分配和归还。

(2)但是有一些类,应该只有一个实例。

这个实例似乎应该在程序启动时被创建出来,且只有在程序结束时才被删除。

Intent :

一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点

Motivation :

对于一些类来说,只有一个实例是很重要的


Singleton

(1)定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作

(2)可能负责创建自己的唯一实例。

模式分析:

(1)单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点

(2)单例模式包含的角色只有一个,就是单例类——Singleton

(3)单例类拥有一个私有构造函数,,确保用户无法通过new关键字直接实例化它。

(4)除此之外,该模式中包含一个静态私有成员变量与静态公有的工厂方法。

该工厂方法负责检验实例的存在性并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。


public class Singleton {
	//静态私有成员变量
	private static Singleton instance = null;
	//私有构造函数
	private Singleton() {
	
	}
	//静态公有工厂方法,返回唯一实例
	public static Singleton getInstance() {
		
		if(instance ==null)
			instance =new Singleton();
		return instance;
	}
}

注意的三点:

(1)单例类的构造函数为私有

(2)提供一个自身的静态私有成员变量

(3)提供一个公有的静态成员方法


对唯一实例的受控访问,缩小名空间;是对全局变量的一种改进;

允许对操作和表示的精化,Singleton类可以有子类;

允许可变数目的实例;

比类操作更加灵活。


  为了节约系统资源,在联机射击游戏中可以实现一些管理器
(Manager) ,如场景管理器(SceneManager) 、声音管理器
(SoundManager) 等,如何实现?


public class SceneManager {
	private static SceneManager instance = null;
	private  SceneManager() {
	
	}
	
	public static SceneManager getInstance() {
		if(instance ==null)
			instance =new SceneManager();
		return instance;
	}
}

单例模式的优点:

(1)提供了对唯一实例的受控访问

(2)由于系统内存中只存在一个对象,因此可以节约系统资源,提高系统性能

(3)允许可变数目的实例

单例模式的缺点:

(1)由于单例模式中没有抽象层,因此单例模式的扩展有很大的困难

(2)单例模式的职责过重

(3)滥用单例模式带来一些负面问题


单例模式的适用环境

(1)系统只需要一个实例对象

(2)客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

在一个系统中要求一个类只有一个实例时才应当使用单例模式。反过来如果一个类可以有几个实例共存,就需要对单例模式进行改进,使之成为多例模式。

单例模式的实现方法:

(1)饿汉式单例:  在类加载的时候就立即创建对象

(2)懒汉式单例: 只是在外部对象第一次请求实例的时候才去创建



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值