特殊的类:
(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)懒汉式单例: 只是在外部对象第一次请求实例的时候才去创建