JavaScript设计模式:简单工厂模式详解与实战

作者:半夏

时间:2026-10-29

浏览:456

本文深入解析JavaScript中的简单工厂模式,通过旅游网站订票案例展示如何分离对象创建与使用。详细阐述其结构、优点及适用场景,帮助开发者降低类间耦合,提升代码可维护性与扩展性。

文章目录

阅读目录

基本介绍 举例说明 总结说明

简单工厂模式基本介绍

简单工厂模式的核心在于通过一个特定的方法来决定实例化哪一个类,这些被创建的类通常共享相同的接口。该模式主要适用于在编译期无法确定具体类型,而需在执行期动态决定的场景。通俗而言,这类似于公司茶水间的饮料机,用户按下不同按钮即可获取咖啡或牛奶,无需关心内部制造过程。

在创建Ajax对象等场景中,简单工厂模式同样具有实用价值。

常规的对象创建方式通常依赖new关键字调用构造函数,这往往导致类之间产生紧密的依赖关系。工厂模式旨在消除这种耦合,通过封装一个专门的方法来决定实例化哪个类。本文将详细阐述简单工厂模式的理论基础,并结合具体代码示例展示其实际应用。

基本介绍

作为工厂模式家族中最基础的一种,简单工厂模式通过定义一个工厂类,依据传入的参数来实例化具体的产品类。

举例说明

简单工厂模式举例说明

假设我们正在开发一个旅游行业网站,主要销售机票和酒店产品。当用户准备购买机票时,我们可以定义如下相关类:


 var productEnums = {
   flight: "flight",
   hotel: "hotel"
 };
 function Flight() {
   console.log("This is Flight");
 }
 function Hotel() {
   console.log("This is Hotel");
 }
 function User() {
   this.shopCart = [];
 }
 User.prototype = {
   constructor: User,
   order: function (productType) {
     var product = null;
     switch (productType) {
       case productEnums.flight:
         product = new Flight();
       case productEnums.hotel:
         product = new Hotel();
       default:
     }
     this.shopCart.push(product);
   }
 }
 var user = new User();
 user.order(productEnums.flight);

上述代码定义了User(用户)、Flight(机票)和Hotel(酒店)三个类,其中User类包含预订方法。用户预订时直接传入产品类型即可。乍看之下这段代码并无问题,但业务需求是动态变化的。若公司扩展增加签证业务,我们必须修改User类以支持新业务。直接修改User类虽可行,但存在隐患,是否有更优方案?

首先分析User类,它代表用户,本质上与具体业务无关。业务可能随时增加,但用户创建产品订单的逻辑应保持稳定。新增的签证业务与现有的机票、酒店在逻辑上并无本质区别。若每增加一种业务就修改User类,将严重损害代码的稳定性和可维护性。更优的解决方案是引入一个专门负责创建订单的类来管理不同业务,即简单工厂。

修改后的代码如下:


var productFactory = (function () {
   var productFactories = {
     "flight": function () {
       return new Flight();
     },
     "hotel": function () {
       return new Hotel();
     }
   };
   return {
     createProduct: function (productType) {
       return productFactories[productType]();
     }
   }
 })();
 User.prototype = {
   constructor: User,
   order: function (productType) {
     this.shopCart.push(productFactory.createProduct(productType));
   }
 }

这段代码主要进行了两处关键修改:

(1)新增了一个产品工厂,根据传入的产品类型返回对应的对象实例。

(2)修改User类的order方法,使其调用工厂类中的创建产品方法,而非直接实例化。

这样做带来的好处包括:

(1)使User的order方法职责更加单一,专注于预订产品功能;将创建产品订单的逻辑提取到专门的工厂类中,使代码结构更简洁清晰。

(2)通过专门的Factory管理Product,添加新产品变得容易,无需再修改User类,提升了系统的可扩展性。

简单工厂模式总结与适用场景

总结说明

简单工厂模式的主要特点是将对象的创建过程与使用过程分离,其结构主要包含三个部分:

1. 对象使用类:该类是被工厂创造出来的使用者,它只负责使用产品,与对象的种类和创建过程无关。

2. 工厂类:根据传入的参数创建不同的对象并返回给对象使用类。它包含了不同对象的创建逻辑,若新增对象类型,则需修改该类。

3. 对象类:不同业务产生的不同类,即工厂生产的具体产品。

简单工厂模式优点

1. 工厂类集中了所有对象的创建逻辑,便于对对象创建进行统一管理。

2. 对象的使用者仅需关注使用产品,实现了单一职责原则。

3. 便于扩展:若新增一种业务,只需增加相关的业务对象类和工厂类中生产该业务对象的方法,无需修改其他现有代码。

适用场景

1. 需要根据不同参数产生不同实例,且这些实例具有某些共性的场景。

2. 使用者仅需使用产品,无需知晓产品的具体创建细节。

注意:除非符合上述适用场景,否则不可滥用工厂模式,否则可能导致代码复杂度增加。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章