本文深入解析 JavaScript 中的工厂模式,通过弹窗类示例展示其如何替代简单工厂模式。重点阐述工厂模式如何通过将创建逻辑延迟至子类,实现新增产品时不修改现有代码的目标。文章对比了两种模式的优缺点,探讨了在大型项目中如何管理工厂类与具体实现,并提供了完整的代码示例与总结。
工厂模式概述
本文详细介绍 JavaScript 中的工厂模式及其实际应用,旨在为读者提供清晰的原理说明与可参考的代码案例。
在前文中,我们探讨了简单工厂模式,但该模式存在一个显著缺陷:每当需要扩展新功能时,必须修改工厂类的源代码。尽管在之前的示例中进行了部分优化,但使用者仍需明确指定执行方法的名字,这无形中增加了使用门槛。那么,如何在引入新产品时不影响既有代码?工厂模式正是为了解决这一矛盾而诞生的。
工厂模式的定义是:创建一个用于生成对象的接口,由子类决定实例化哪一个具体类。该模式将类的实例化过程推迟到其子类中执行。它也被称为工厂方法模式、虚拟构造器模式或多态工厂模式,属于类创建型设计模式的一种。
工厂模式应用场景与实现
为了更直观地理解,我们沿用简单工厂模式中的场景,尝试使用工厂模式来解决弹窗类的问题。
具体实现代码如下:
代码示例
var Dialog = function(){
this.show = function(){
console.log(this.name + ' is show -> ' + this.element);
}
};
Dialog.createNotice = function(){
var _dialog = new Dialog();
_dialog.element = '<div>notice</div>';
_dialog.name = 'notice';
return _dialog;
};
Dialog.createToast = function(){
var _dialog = new Dialog();
_dialog.element = '<div>toast</div>';
_dialog.name = 'toast';
return _dialog;
};
Dialog.createWarnin = function(){
var _dialog = new Dialog();
_dialog.element = '<div>warnin</div>';
_dialog.name = 'warnin';
return _dialog;
};
var Factory = {};
Factory.NoticeFactory = function(){
return Dialog.createNotice();
}
Factory.ToastFactory = function(){
return Dialog.createToast();
}
Factory.WarninFactory = function(){
return Dialog.createWarnin();
}
var notice = Factory.NoticeFactory();
var toast = Factory.ToastFactory();
var warnin = Factory.WarninFactory();
notice.show(); //notice is show -> <div>notice</div>
toast.show(); //toast is show -> <div>toast</div>
warnin.show(); //warnin is show -> <div>warnin</div>
工厂模式与简单工厂的对比
与简单工厂模式相比,工厂模式主要解决了以下问题:
核心改进在于将简单工厂模式中的 factory 方法进行了拆分。
具体的创建逻辑被下放,由子类(即 createToast 等方法)来实现。
同时,所有的工厂入口被拆分为独立的工厂类。在之前的简单工厂模式中,新增功能往往需要修改工厂类本身,这违反了开闭原则。
工厂模式的核心优势在于保证在新增功能时,只需添加新代码,而无需修改已有代码。
当项目规模足够庞大时,建议将 Factory 基类及其子类分别拆分为独立的文件进行管理,以提高代码的可维护性。
在编写工厂模式相关内容的过程中,我查阅了大量资料,发现不同开发者对这一模式的理解存在差异。
许多看到的工厂模式示例,实际上更接近于我们之前介绍的简单工厂模式。这是为什么呢?
本示例参考了 Java 相关书籍,其中包含了“抽象类”这一概念。由于前端开发中通常没有直接的抽象类支持,我们需要依靠自身的理解来描述这一机制。
因此,我们尽力通过展示具体差异来详细介绍每一种模式,以帮助读者区分它们。
这里的示例可能在严谨性上尚有不足,后续我会逐步优化并补充更详细的说明。撰写本文的唯一目的是:
当未来有人询问简单工厂模式和工厂模式的区别时,我希望能够给出一个清晰且基于实践的理解。
工厂模式总结
以下是对工厂模式的总结:
优点包括: * 在增加新产品时,无需修改已存在的代码。 * 仅暴露工厂类接口,将具体实现封装在内部,使用者无需关注内部实现细节。
缺点包括: * 新增功能时仍需新增具体实现类以及对应的工厂类,这在一定程度上增加了系统的复杂度,并带来额外的开销。 * 每个工厂类仅负责生产一种产品,这会导致系统中存在大量的工厂类,从而大幅增加系统的维护成本和运行开销。
感兴趣的朋友可以使用在线 HTML/CSS/JavaScript 代码运行工具:http://tools.jb51.net/code/HtmlJsRun 测试上述代码的运行效果。
更多关于 JavaScript 相关内容感兴趣的读者可查看本站专题:《javascript 面向对象入门教程》、《JavaScript 错误与调试技巧总结》、《JavaScript 数据结构与算法技巧总结》、《JavaScript 遍历算法与技巧总结》及《JavaScript 数学运算用法总结》。
希望本文所述内容对大家学习 JavaScript 程序设计有所帮助。