JS之单例模块模式

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>稳妥构造函数and静态私有变量的实现原理</title>
</head>
<body>
<script type="text/javascript">
//test 模块模式(为单例创建私有变量和特权方法)
var singleon = function(){
	var name;
	
	return {
		
		getName: function() { return name},

		setName: function(value) { name = value}
	};
}();

singleon.setName("oyxb");
console.log(singleon.getName());
</script>
</body>
</html>

<think>我们正在回答用户关于JavaScript中三种设计模式的问题:模式、工厂模式模块模式。我们将根据引用内容并结合实际应用进行说明。引用内容回顾:引用[1]提到设计模式是解决特定问题的简洁而优雅的方案,并指出JavaScript中常用的七大设计模式类型。引用[2]和引用[3]分别提供了模式和工厂模式的代码示,其中模式确保一个类只有一个实例,而工厂模式则负责创建对象。注意:用户的问题中提到了“模块模式”,但我们之前引用中并没有直接提到模块模式。不过,我们可以结合JavaScript的模块化发展进行说明。因此,我们将分别介绍:1.模式(SingletonPattern)2.工厂模式(FactoryPattern)3.模块模式(ModulePattern)注意:模块模式在JavaScript中是一种封装私有变量和公有方法的方式,它利用闭包来实现信息隐藏和封装。我们将按照以下结构进行:-定义-用途-实现示注意:用户要求详细说明及实现。另外,根据用户之前的上下文,我们之前已经回答了模式、观察者模式和工厂模式,而这次用户明确要求、工厂和模块模式。因此,这里我们将重点放在这三种模式上。开始回答:</think> ### JavaScript设计模式详解:模式、工厂模式模块模式 #### 1. **模式 (Singleton Pattern)** **定义**: 确保类仅有一个实例对象,并提供全局访问点。常用于需要共享资源或全局状态管理的场景,如配置管理、数据库连接池等[^1]。 **核心特性**: - 惰性初始化(首次调用时创建) - 全局唯一实例 - 线程安全(在JS线程环境下) ```javascript // 模式实现(闭包版本) const Singleton = (() => { let instance; function init() { // 私有方法和属性 const privateVar = Math.random(); return { // 公有方法 getRandom: () => privateVar }; } return { getInstance: () => { if (!instance) instance = init(); return instance; } }; })(); // 测试验证 const a = Singleton.getInstance(); const b = Singleton.getInstance(); console.log(a === b); // true console.log(a.getRandom()); // 0.123 (相同值) ``` #### 2. **工厂模式 (Factory Pattern)** **定义**: 定义一个创建对象的接口,让子类决定实例化哪个类。将对象创建逻辑与使用代码解耦,特别适合创建复杂对象或需要动态生成对象的场景[^2]。 **核心特性**: - 封装实例化过程 - 支持开闭原则(扩展开放/修改关闭) - 统一创建接口 ```javascript // 汽车工厂示 class Sedan { drive() { return "驾驶轿车" } } class SUV { drive() { return "驾驶越野车" } } class CarFactory { createCar(type) { switch(type) { case "sedan": return new Sedan(); case "suv": return new SUV(); default: throw new Error("未知车型"); } } } // 使用工厂 const factory = new CarFactory(); const myCar = factory.createCar("suv"); console.log(myCar.drive()); // "驾驶越野车" ``` #### 3. **模块模式 (Module Pattern)** **定义**: 通过闭包封装私有变量和公有API,实现命名空间隔离。这是JavaScript特有的模式,用于模拟传统面向对象语言中的"类"概念[^3]。 **核心特性**: - 私有变量封装 - 减少全局污染 - 支持模块化开发 ```javascript // 计数器模块 const CounterModule = (() => { // 私有变量 let count = 0; // 私有方法 const log = (msg) => console.log(`[计数器]: ${msg}`); return { // 公有API increment: () => { count++; log(`增加至 ${count}`); }, reset: () => { count = 0; log("已重置"); }, getValue: () => count }; })(); // 使用模块 CounterModule.increment(); // [计数器]: 增加至 1 CounterModule.increment(); // [计数器]: 增加至 2 console.log(CounterModule.getValue()); // 2 ``` ### 模式对比表 | 模式 | 核心目的 | 适用场景 | 关键优势 | |------------|---------------------------|-----------------------------|-----------------------| | **模式** | 全局唯一实例访问 | 配置管理/状态共享 | 资源节省/一致性保证 | | **工厂模式** | 解耦对象创建与使用 | 多态对象/复杂初始化 | 扩展灵活/代码复用 | | **模块模式** | 封装私有状态与公有接口 | 工具库/组件开发 | 命名空间隔离/安全性 | > 💡 **最佳实践建议** > 1. 优先使用模块模式组织业务代码(现代JS已支持原生模块) > 2. 避免滥用模式(可能导致"上帝对象"问题) > 3. 工厂模式与TypeScript接口结合可获得最佳类型安全[^2] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值