JavaScript设计模式详解:揭示模块与单例模式

作者:代码拾荒时间:2026-10-25 19:08:34浏览:184

本文深入解析JavaScript中的揭示模块模式与单例模式。揭示模块通过返回对象暴露私有方法,提升代码可读性;单例模式确保类仅有一个实例并提供全局访问点。文章结合代码示例,阐述两种模式的实现细节、优缺点及适用场景,帮助开发者优化JS架构。

1. 揭示模块模式(Revealing Module)

该模式允许在私有作用域内定义所有函数和变量,最终返回一个匿名对象。该对象包含指向私有函数的引用,这些引用代表了希望对外公开的接口方法。

具体实现示例如下:

<script>
var myRevealingModule = function () {
    var privateVar = "Ren Cherry",
            publicVar = "Hey there";
    function privateFunction() {
            console.log("Name:"+privateVar);
    }
    function publicSetName(strName) {
            privateName = strName;
    }
    function publicGetName() {
            privateFunction();
    }
    //将暴露的公有指针指向到私有函数和属性上
    return {
            setName: publicSetName,
            greeting: publicvar,
            getName: publicGetName
    };
}();
myRevealingModule.setName("Paul Kinlan");
</script>

主要优势:

  • 此模式使得哪些函数和变量可供外部访问变得一目了然,从而显著提升了代码的可读性。
  • 需要注意的是,如果某个私有函数内部引用了另一个公有函数,在进行代码修补时,该公有函数将无法被覆盖。这是因为私有函数依然指向原始的私有实现。因此,该模式主要适用于函数封装,并不完全适用于所有类型的公有成员暴露。

2. 单例模式(Singleton)

单例模式的核心在于限制类的实例化次数,确保整个系统中该类仅能存在一个实例。当所需实例尚不存在时,通过特定方法创建新实例;若实例已存在,则直接返回该现有对象的引用。

代码实现示例:

<script type="text/javascript">
var mySingleton = (function () {
        //实例保持了singleton 的一个引用
        var instance;
        function init() {
                //singleton
                //私有方法和变量
                function privateMethod() {
                        console.log("I am private");
                }
                var privateVariable = "I am also private";
                var privateRandomNumber = Math.random();
                return {
                        //公有方法和变量
                        publicMethod: function () {
                                console.log("The public can see me!");
                        },
                        publicProperty: "I am also public",
                        getRandomNumber: function() {
                                return privateRandomNumber;
                        }
                };
        };
        return {
                //获取singleton 的实例,如果存在就返回,不存在就创建新实例
                getInstance: function() {
                        if(!instance) {
                                instance = init();
                        }
                        return instance;
                }
        };
})();
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log(singleA.getRandomNumber()===singleB.getRandomNumber());//true
</script>

在实际开发中,当系统需要一个对象来协调其他多个对象的交互时,单例模式具有极高的应用价值。

另一种单例模式的实现示例:

<script type="text/javascript">
var SingletonTester = (function() {
        //options: 包含singleton所需配置信息的对象
        //var options = {name:"test",pointX:5};
        function Singleton(options) {
                //如果未提供options,则设置为空对象
                options = options || {};
                //为singleton设置一些属性
                this.name = "SingletonTester";
                this.pointX = options.pointX || 6;
                this.pointY = options.pointY || 10;
        }
        //实例持有者
        var instance;
        //静态变量和方法的模拟
        var _static = {
                name: "SingletonTester",
                //获取实例的方法,返回singleton对象的singleton实例
                getInstance: function(options) {
                        if(instance === undefined) {
                                instance = new Singleton(options);
                        }
                        return instance;
                };
                return _static;
        }
})();
var singletonTest = SingletonTester.getInstance({
        pointX: 5
});
console.log(singletonTest.pointX);//5
</script>

以上是对JavaScript设计中揭示模块模式与单例模式的详细解析,更多JS相关设计模式资料请持续关注本站内容。

作者最新文章