【读书笔记】设计模式 - 单例模式

简介:

神马是单例模式?简单的讲,就是某个构造函数,有且仅有一个实例存在,无论你调用该构造函数来创建实例多少次,如:

function Class(){}    //仅仅用来举例

var instance_01 = new Class();
var instance_02 = new Class();

console.log( instance_01===instance_02 );    //输出:true

 

我们知道,在javascript,当且仅当 instance_01instance_02 指向的是 同一个实例对象,上述表达式才有可能输出为true,换言之,即:

如果instance_01 instance_02 指向的不是同一个实例对象,即使 instance_01 与 instance_02 拥有完全相同的属性值,上述表达式也会输出 false

可以做个小测试:

function Wife( name ){
    this.name = name;
}
Wife.prototype.shout = function(){
    console.log( 'i\'m your only wife '+ this.name +' , do remember !');
};

var wife_01 = new Wife( 'Marry' );
var wife_02 = new Wife( 'Mary' );

console.log( wife_01===wife_02 );    //尽管名字相同,但输出为:false,妻子竟然有两个,天~~

 

那么,最上面举的那个例子是怎么实现的呢?

最简单直观的思路:第一次调用该构造函数创建实例对象的时候,可以将该实例对象的引用保存下来,接下来,当该构造函数被再次调用,无论多少次,都只是返回之前保存的那个实例对象

还是用 妻子 那个例子:

function Wife( name ){
    if( Wife.instance ){
        return Wife.instance;
    }
    Wife.instance = this;
    this.name = name;
}

Wife.prototype.shout = function(){
    console.log( 'i\'m your only wife '+ this.name +' , do remember !');
};    
var wife_01 = new Wife( 'Marry' );
wife_01.shout();    //输出:i'm your only wife Marry , do remember !

var wife_02 = new Wife( 'Lucy' );
wife_02.shout();    //输出:i'm your only wife Marry , do remember !

console.log( wife_01===wife_02 );    //输出:true

 

很好,现在已经符合一夫一妻制的要求了,但总觉得有些不对劲——如果有人将 Wife.instance 恶意修改了,那不久悲剧了

针对于此,打个小补丁:

var Wife = (function(){
    var instance = null;    //外部无法直接访问,于是安全了
    var _wife = function( name ){
        if( instance ){
            return instance;
        }
        instance = this;
        this.name = name;
    }
    return _wife;
})();

Wife.prototype.shout = function(){
    console.log( 'i\'m your only wife '+ this.name +' , do remember !');
};    
var wife_01 = new Wife( 'Marry' );
wife_01.shout();    //输出:i'm your only wife Marry , do remember !

var wife_02 = new Wife( 'Lucy' );
wife_02.shout();    //输出:i'm your only wife Marry , do remember !

console.log( wife_01===wife_02 );    //输出:true

 

OVER


相关文章
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
36 2
|
1月前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
30 2
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
48 4
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
30 1
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
33 0
|
3月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
3月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
111 1

热门文章

最新文章