js设计模式 --- 工厂模式

简单工厂

由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。简单来讲,就是根据原料生成不同的产品

优点:只需要一个正确的参数就可以获取到所需要的对象,而无需知道其创建的具体细节

缺点:函数内包含了所有对象的创建逻辑和判断逻辑的代码,对象数量过多时难以维护

适用于:创建的对象数量较少,对象的创建逻辑不复杂

案例:后台的权限管理系统

javascript 复制代码
    function User(role, pages) {
        this.role = role;
        this.pages = pages;
    }
    var a = new User("superAdmin",["home","user-manage","right-manage","news-manage"])
    var b = new User("admin",["home","user-manage","news-manage"])
    var c = new User("editor",["home","news-manage"])
    //a.role === current.role

改进:

添加生成User对象的函数

javascript 复制代码
    function UserFactory(role) {
        function User(role, pages) {
            this.role = role;
            this.pages = pages;
        }
        switch (role) {
            case "superAdmin":
                return new User("superAdmin", ["home", "user-manage", "right-manage", "news-manage"])
            case "admin":
                return new User("admin", ["home", "user-manage", "news-manage"])
            case "editor":
                return new User("editor", ["home", "news-manage"])
            default:
                return new User("guest", ["home"])
        }
    }
    var user = UserFactory("editor")

    // es6写法
    class User {
        constructor(role, pages) {
            this.role = role;
            this.pages = pages;
        }
        // 生成User对象的函数。简单工厂:根据原料生成不同的产品。
        static UserFactory(role) {
            switch (role) {
                case "superAdmin":
                    return new User("superAdmin", ["home", "user-manage", "right-manage", "news-manage"])
                case "admin":
                    return new User("admin", ["home", "user-manage", "news-manage"])
                case "editor":
                    return new User("editor", ["home", "news-manage"])
                default:
                    return new User("guest", ["home"])
            }
        }
    }

    var user = User.UserFactory("editor")

抽象工厂

抽象工厂模式并不直接生成实例,而是用于对产品类簇的创建。在简单工厂基础上进一步解耦,对扩展开放,对修改关闭。

通俗一点:抽象工厂不生产水,只是大自然的搬运工。

适用于:大型应用,对象逻辑复杂

上述案例扩展:不同的角色有不同的页面渲染逻辑

图示:

代码:

javascript 复制代码
//抽象产品类
class User{
    constructor(name,role,pages){
        this.name = name
        this.role = role
        this.pages = pages
    }
    welcome(){
        console.log("欢迎回来",this.name)
    }
    dataShow(){
        //abstract
        throw new Error("抽象方法需要被实现")
    }
}
class SuperAdmin extends User{
    constructor(name){
        super(name,"superAdmin",["home","user-manage","right-manage","news-manage"])
    }
    //重写dataShow
    dataShow(){
        console.log("superAdmin-dataShow")
    }
    // 特有方法
    addRight(){

    }
    addUser(){

    }
}
class Admin extends User{
    constructor(name){
        super(name,"admin",["home","user-manage","news-manage"])
    }
    //重写dataShow
    dataShow(){
        console.log("admin-dataShow")
    }
    // 特有方法
    addUser(){
        
    }
}
    class Editor extends User{
    constructor(name){
        super(name,"editor",["home","news-manage"])
    }
    //重写dataShow
    dataShow(){
        console.log("editor-dataShow")
    }
}

// 抽象工厂的简化形式,这里直接返回类
function getAbstractUserFactory(role){
    switch(role){
        case "superAdmin":
            return SuperAdmin
        case "admin":
            return Admin
        case "editor":
            return Editor
        default:
            throw new Error("参数错误")
    }
}

let UserClass = getAbstractUserFactory("superAdmin")
console.log(UserClass)
let user = new UserClass("mill")
console.log(user)

抽象工厂的核心目标 是封装产品创建,返回实例 是标准做法,返回类是前端常见的简化形式;

无论返回类还是实例,核心都是让客户端不直接依赖具体产品类,符合抽象工厂 "解耦创建逻辑" 的核心思想。

相关推荐
高晶3 分钟前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
高晶16 分钟前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
延晗33 分钟前
【从零开始 DeepSeek Harness 插件开发教程】二、一切皆插件:简单理解一下 Cordis 内核与 DSH 心智模型
设计模式·deepseek
高晶2 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
日和雫7 小时前
封装、继承、多态 & 组合,为什么组合大于继承?
设计模式
代钦塔拉10 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
haluhalu.10 小时前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
高晶1 天前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风1 天前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
代钦塔拉1 天前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式