菜鸟学设计模式系列笔记之单例设计模式(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)懒汉式单例: 只是在外部对象第一次请求实例的时候才去创建

第一个青春是上帝给的;第二个的青春是*自己努力的

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

相关文章:

你感兴趣的文章:

标签云: