首页 > 编程语言 >JavaScript设计模式-工厂方法模式

JavaScript设计模式-工厂方法模式

时间:2024-11-10 15:15:41浏览次数:3  
标签:log 子类 JavaScript 模式 工厂 产品 new 设计模式

工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,属于类创建型模式。在工厂方法模式中,工厂父类定义了创建产品对象的公共接口,而具体的工厂子类则负责生成不同的产品对象。这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,由工厂子类决定创建哪种具体的产品对象。

描述

在简单工厂模式中,类的创建依赖于工厂类,这意味着要扩展程序就必须修改工厂类的代码。相比之下,工厂方法模式将创建的具体过程交给专门的工厂子类去完成,即产品的实例化操作在工厂子类中实现,这样不需要修改工厂类本身,只需定义实现工厂接口的子类即可。

模式分析

工厂方法模式进一步抽象了简单工厂模式的概念。通过使用面向对象的多态特性,工厂方法模式保留了简单工厂模式的优点,同时解决了其缺点。工厂方法模式中,核心工厂类不再负责所有产品的创建工作,而是将创建工作交由子类来实现。核心工厂类仅定义创建产品的方法接口,而不关心具体哪个产品类被实例化,这使得可以在不修改工厂角色的情况下引入新产品。

模式结构

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

实现

工厂方法模式的核心思想是将对象的创建延迟到子类中。在 JavaScript 中没有传统的抽象类机制,但我们可以通过定义接口的方式来实现工厂方法模式的思想。

示例:日志记录器
// 抽象产品类
class Logger {
    log(message) {
        throw new Error("This method should be implemented by subclasses");
    }
}

// 具体产品类:文件记录器
class FileLogger extends Logger {
    log(message) {
        console.log(`Writing "${message}" to a file.`);
    }
}

// 具体产品类:控制台记录器
class ConsoleLogger extends Logger {
    log(message) {
        console.log(`Logging to console: ${message}`);
    }
}

// 具体产品类:网络记录器
class NetworkLogger extends Logger {
    log(message) {
        console.log(`Sending "${message}" to a remote server.`);
    }
}

// 抽象工厂类
class LoggerFactory {
    createLogger() {
        throw new Error("This method should be implemented by subclasses");
    }
}

// 具体工厂类:文件记录器工厂
class FileLoggerFactory extends LoggerFactory {
    createLogger() {
        return new FileLogger();
    }
}

// 具体工厂类:控制台记录器工厂
class ConsoleLoggerFactory extends LoggerFactory {
    createLogger() {
        return new ConsoleLogger();
    }
}

// 具体工厂类:网络记录器工厂
class NetworkLoggerFactory extends LoggerFactory {
    createLogger() {
        return new NetworkLogger();
    }
}

// 使用工厂方法创建不同的日志记录器
const fileLogger = new FileLoggerFactory().createLogger();
fileLogger.log("This is a file log entry."); // Writing "This is a file log entry." to a file.

const consoleLogger = new ConsoleLoggerFactory().createLogger();
consoleLogger.log("This is a console log entry."); // Logging to console: This is a console log entry.

const networkLogger = new NetworkLoggerFactory().createLogger();
networkLogger.log("This is a network log entry."); // Sending "This is a network log entry." to a remote server.
优化工厂方法的使用

在实际开发中,我们可以将日志工厂进一步简化成一个工厂管理器,由它负责返回不同的日志工厂实例,从而简化调用者的使用。

class LoggerFactoryManager {
    static getFactory(type) {
        switch (type) {
            case "file":
                return new FileLoggerFactory();
            case "console":
                return new ConsoleLoggerFactory();
            case "network":
                return new NetworkLoggerFactory();
            default:
                throw new Error("Unknown Logger Type");
        }
    }
}

const logger = LoggerFactoryManager.getFactory("network").createLogger();
logger.log("This is a dynamic network log entry.");

优点

  • 隐藏创建细节:工厂方法模式隐藏了具体产品的创建过程,客户端只需关心对应工厂,而不必了解具体的产品创建细节。
  • 多态性:工厂方法模式利用多态设计,工厂可以自主决定创建哪个产品对象,创建细节完全封装在具体工厂中。
  • 开放封闭原则:增加新产品时,只需添加新的工厂和产品类,不必修改已有工厂和产品类,从而增强了系统的扩展性。

缺点

  • 类增加:每增加一种新产品,必须新增一个具体产品类和一个对应的具体工厂类,系统中类的数量成对增加,增大了系统的复杂度。
  • 抽象性:由于引入了抽象层,客户端代码中需要使用抽象层定义产品,增加了系统的理解难度。

工厂方法模式适合于产品种类较多且经常变动的系统,通过子类来动态扩展和创建具体产品,避免了对已有代码的直接修改,有利于扩展和维护。

原文链接:

https://anyaowl.cn/blog/detail/12

标签:log,子类,JavaScript,模式,工厂,产品,new,设计模式
From: https://blog.csdn.net/m0_65747046/article/details/143661381

相关文章

  • 白骑士的JavaScript教学高级篇之错误处理与调试 4.4.1 错误的类型与处理(try, catch, t
            在JavaScript开发中,错误处理与调试是编写健壮代码的重要组成部分。了解如何有效地捕获和处理错误可以提高应用的稳定性和用户体验。JavaScript提供了几种机制来处理错误,包括‘try‘,‘catch‘,‘throw‘,和‘finally‘。下面将详细介绍这些机制以及它们的......
  • 学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计
    ......
  • 使用HTML、CSS和JavaScript创建动态雪人和雪花效果
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 基于HTML+CSS+JavaScript仿淘宝购物商城设计毕业论文源码
    常见网页设计作业题材有个人、美食、公司、学校、旅游、电商、宠物、电器、茶叶、家居、酒店、舞蹈、动漫、服装、体育、化妆品、物流、环保、书籍、婚纱、游戏、节日、戒烟、电影、摄影、文化、家乡、鲜花、礼品、汽车、其他等网页设计题......
  • Regex 历史 / 规范 / 流派 | JavaScript 匹配 emoji
    注:本文为几篇regex相关合辑。机翻,未校,未整理。RegexHistoryandHow-ToCrystalVillanuevaJan14,2021Aregularexpression,alsoknownasregexorregexp,isaspecialstringthatpresentsitselfrepeatedlyinasearchpattern;today,programmersuse......
  • javascript中的this
    在JavaScript中,this关键字的值取决于它被使用的上下文。它并不像其他编程语言中的this总是指向对象的实例,而是可能指向不同的对象。以下是几种常见的this的用法及其指向的内容:全局上下文在全局范围(即没有在任何函数或对象内)中,this指向全局对象。在浏览器中,这通常是window对象。......
  • 软件工程中的创建型设计模式:工厂方法模式与抽象工厂模式
    目录1.工厂方法模式(FactoryMethodPattern)1.1核心概念1.2应用场景1.3优点2.抽象工厂模式(AbstractFactoryPattern)2.1核心概念2.2应用场景2.3优点3.联系与区别4.拓展知识5.结语        在软件工程领域,我们经常探讨如何通过设计模式来提高代码......
  • JavaScript中的解构赋值
    写在前面在JavaScript中,解构赋值是一种简洁而强大的语法特性,它允许我们从数组或对象中提取值并将其分配给变量。这个功能可以大大简化代码,提高可读性和可维护性。今天,我们将深入探讨解构赋值的用法和规则。数组解构赋值数组解构赋值允许我们从数组中提取值并将其分配给变......
  • 大模型-大模型-架构设计-6种设计模式-09
    目录1.路由分发架构模式2.代理架构模式3.基于缓存的微调架构模式4.面向目标的Agent架构模式5.Agent智能体组合架构模式6.双重安全架构设计模式架构设计模式已成为程序员的重要技能。然而,当我们转向大模型应用领域,情况可能会有所不同。面对新兴技术,比如:生成式AI,我们尚缺......
  • 静态工厂和构造器区别
    publicclassProduct{privateintid;privateStringname;//构造器publicProduct(intid,Stringname){this.id=id;this.name=name;}//静态工厂方法publicstaticProductcreateProduct(intid,Stringnam......