乐趣区

关于前端:设计模式之单例模式

设计模式中最简略的酒是单例模式,单例模式的目标是为了保障在一个过程中,某一类只有一个实例存在。如何保障一个类只有一个示例并且这个实例又能易于被拜访呢?定义一个全局变量能够确保对象随时都能够被拜访,但不能避免咱们实例化多个对象。

其中一个更好的解决办法是让类本身负责保留它的惟一示例。这个类能够保障没有其余实例被创立,并且它能够提供一个拜访该实例的办法。

单例模式的要点有三个,一是某个类只能有一个实例;二是它必须自行创立这个实例;三是它必须自行向整个零碎提供这个实例。单例模式是一种对象创立型模式。单例模式又名单件模式或单态模式。

什么是单例模式

单例模式:也叫单子模式,是一种罕用的软件设计模式,属于创立型模式的一种。在利用这个模式时,单例对象的类必须保障只有一个实例存在。许多时候整个零碎只须要领有一个的全局对象,这样有利于咱们协调系统整体的行为。比方在某个服务器程序中,该服务器的配置信息寄存在一个文件中,这些配置数据由一个单例对象对立读取,而后服务过程中的其余对象再通过这个单例对象获取这些配置信息。这种形式简化了在简单环境下的配置管理。—— 节选自维基百科

对于零碎中的某些类来说,只有一个实例很重要,例如,一个零碎中能够存在多个打印工作,然而只能有一个正在工作的工作;一个零碎只能有一个窗口管理器或文件系统;一个零碎只能有一个计时工具或 id 生成器。

单例模式优缺点

单例模式的目标是保障一个类仅有一个实例,并提供一个拜访它的全局拜访点。单例模式蕴含的角色只有一个,就是单例类——Singleton。单例类领有一个公有构造函数,确保用户无奈通过new` 关键字间接实例化它。除此之外,该模式中蕴含一个动态公有成员变量与动态私有的工厂办法,该工厂办法负责测验实例的存在性并实例化本人,而后存储在动态成员变量中,以确保只有一个实例被创立。

在单例模式的实现过程中,须要留神如下三点:

  1. 单例类的构造函数为公有
  2. 提供一个本身的动态公有成员变量
  3. 提供一个私有的动态工厂办法

长处

  1. 提供了对惟一实例的受控拜访。因为单例类封装了它的惟一实例,所以它能够严格控制客户怎么以及何时拜访它,并为设计及开发团队提供了共享的概念。
  2. 因为在零碎内存中只存在一个对象,因而能够节约系统资源,对于一些须要频繁创立和销毁的对象,单例模式无疑能够进步零碎的性能。
  3. 容许可变数目标实例。咱们能够基于单例模式进行扩大,应用与单例管制类似的办法来取得指定个数的对象实例。

毛病

  1. 因为单例模式中没有形象层,因而单例类的扩大有很大的艰难。
  2. 单例类的职责过重,在肯定水平上违反了“繁多职责准则”。因为单例类既充当了工厂角色,提供了工厂办法,同时又充当了产品角色,蕴含一些业务办法,将产品的创立和产品的自身的性能交融到一起。
  3. 滥用单例将带来一些负面问题,如为了节俭资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而呈现连接池溢出,如果实例化的对象长时间不被利用,零碎会认为它是垃圾,会主动销毁并回收资源,下次利用时又将从新实例化,这将导致对象状态的失落。

示例

单例模式次要蕴含一个类:

单例类:申明了一个名为 getInstance 办法,用来获取示例的静态方法来返回其所属类的一个雷同的示例。单例的构造函数必须对客户端代码暗藏。调用 getInstance 办法必须是获取单例对象的惟一形式。

类图如下所示:

代码示例:

//  办法 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');

总结

单例模式作为泛滥设计模式中最简略的一个设计模式,为了保障某个类只存在一个实例,这个类称为单例类,它提供全局拜访的办法。在单例类的外部实现只生成一个实例,同时它提供一个动态的工厂办法,让客户能够应用它的惟一实例;为了避免在内部对其实例化,将其构造函数设计为公有。

退出移动版