设计模式中最简单的酒是单例模式,单例模式的目的是为了保证在一个进程中,某一类只有一个实例存在。如何保证一个类只有一个示例而且这个实例又能易于被访问呢?定义一个全局变量能够确保对象随时均可以被访问,但不能防止咱们实例化多个对象。数据库
其中一个更好的解决办法是让类自身负责保存它的惟一示例。这个类能够保证没有其余实例被建立,而且它能够提供一个访问该实例的方法。设计模式
单例模式的要点有三个,一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象建立型模式。单例模式又名单件模式或单态模式。服务器
什么是单例模式
单例模式:也叫单子模式,是一种经常使用的软件设计模式,属于建立型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只须要拥有一个的全局对象,这样有利于咱们协调系统总体的行为。好比在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,而后服务进程中的其余对象再经过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 —— 节选自维基百科函数
对于系统中的某些类来讲,只有一个实例很重要,例如,一个系统中能够存在多个打印任务,可是只能有一个正在工做的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或id
生成器。工具
单例模式优缺点
单例模式的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式包含的角色只有一个,就是单例类——Singleton
。单例类拥有一个私有构造函数,确保用户没法经过new
`关键字直接实例化它。除此以外,该模式中包含一个静态私有成员变量与静态公有的工厂方法,该工厂方法负责检验实例的存在性并实例化本身,而后存储在静态成员变量中,以确保只有一个实例被建立。性能
在单例模式的实现过程当中,须要注意以下三点:this
优势
缺点
示例
单例模式主要包含一个类:spa
单例类:声明了一个名为getInstance
方法,用来获取示例的静态方法来返回其所属类的一个相同的示例。单例的构造函数必须对客户端代码隐藏。调用getInstance
方法必须是获取单例对象的惟一方式。设计
类图以下所示:code
代码示例:
// 方法1 class Singleton1 { private static instance : Singleton1 = new Singleton1(); public static getInstance() : Singleton1 { return this.instance; } }; console.log(Singleton1.getInstance(), '11111'); // 方法2 class Singleton2 { private static instance: Singleton2 = null; public static getInstance() : Singleton2 { if (this.instance === null) { this.instance = new Singleton2(); } return this.instance; } }; console.log(Singleton2.getInstance(), '2222'); // 方法3 class Singleton3 { private constructor(){ this.instance = null; } public static getInstance() : Singleton3 { if (this.instance === null) { this.instance = new Singleton3(); } return this.instance; } }; console.log(Singleton3.getInstance(), '3333'); // 方法4 class Singleton4 { static instance:Singleton4; private constructor():Singleton4{ if (Singleton4.instance === undefined) { Singleton4.instance = this; } return Singleton4.instance; } }; console.log(Singleton4.getInstance(), '4444');
总结
单例模式做为众多设计模式中最简单的一个设计模式,为了保证某个类只存在一个实例,这个类称为单例类,它提供全局访问的方法。在单例类的内部实现只生成一个实例,同时它提供一个静态的工厂方法,让客户可使用它的惟一实例;为了防止在外部对其实例化,将其构造函数设计为私有。