单例模式

单例模式(Singleton):又被称为单体模式,是只允许实例化一次的对象类。jQuery库,单例模式就为它提供了一个命名空间。单例模式常用来定义命名空间,解决变量可能会重复的问题,在访问时都通过xxx.xxx方法进行访问。

var set ={
    g:function(id){
        return document.getElementById(id);
    },
    css:function(id,key,value){
        //通过当前对象this来使用g方法
        this.g(id).style[key] = value;
    }
}
//这就是一个单例模式

https://www.cnblogs.com/yonglin/p/8080836.html
传统单例模式

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现单例核心思想

  无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象

在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理。

单例模式的思路是:一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例。

对于 JS 来说,巨大的灵活性使得其可以有多种方式实现单例模式,使用闭包方式来模拟私有数据(静态变量)

var Conf = (function(){
    //私有变量
    var conf = {
        MAX_NUM:100,
        MIN_NUM:1,
        COUNT:1000
    }
    //返回取值器对象
    return {
        get:function(){
            return conf[name] ? conf[name]:null;
        }
    }
})()
没有赋值器就无法修改内部定义的变量
var count = Conf.get('COUNT');
console.log(count); //1000;

//惰性单例 延迟创建的形式
var LazySingle = (function(){
    var _instance = null;
    function Single(){
        return {
            publicMethod:function(){},
            publicProperty: '1.0'
        }
    }
    return function(){
        if(!_instance){
            _instance = Single();
        }
        return _instance;
    }
})()
console.log(LazySingle().publicProperty); //1.0
const paramA = 'A'; //参数A
const paramB = 'B'; //参数B
const paramC = 'C'; //参数C
// ------以上勿修改------

// 根据注释完成代码
class InstanceBase {
    constructor(instanceName) {
        this.instanceName = instanceName;
        this.singleInstance = null;
    }
    // 创建一个接口,返回一个单例
    static getSingleInstance = function(instanceName) {
        if(!this.singleInstance){
            this.singleInstance = new InstanceBase(instanceName);
        }
            return this.singleInstance;
    }
}

// 输出函数勿修改
function getResult () {
    const instance = InstanceBase.getSingleInstance(paramA) && InstanceBase.getSingleInstance(paramB) && InstanceBase.getSingleInstance(paramC)
    return instance.instanceName
}

// 牛客网输出结果,勿修改
console.log(getResult()) //A
设计模式 文章被收录于专栏

设计模式

全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务