前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 - 抽象工厂模式 - JavaScript

设计模式 - 抽象工厂模式 - JavaScript

作者头像
心谭博客
发布2020-04-20 17:04:19
6500
发布2020-04-20 17:04:19
举报
文章被收录于专栏:YuanXinYuanXin

抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。

相较于传统的工厂模式,它多出了一个超级工厂类

专注前端与算法的系列干货分享,转载请声明出处:原文链接: xxoo521.com

什么是抽象工厂模式?

抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。

相较于传统的工厂模式,它多出了一个超级工厂类

它的优缺点与工厂模式类似,这里不再冗赘它的优缺点,下面直接谈一下实现吧。

如何实现抽象工厂模式?

为了让目标更清晰,就实现下面的示意图:

准备实体类

按照之前的做法,这里我们实现几个实体类:Cat 和 Dog 一组、Male 和 Female 一组。

代码语言:javascript
复制
class Dog {
    run() {
        console.log("狗");
    }
}

class Cat {
    run() {
        console.log("猫");
    }
}

/*************************************************/

class Male {
    run() {
        console.log("男性");
    }
}

class Female {
    run() {
        console.log("女性");
    }
}

准备工厂类

假设 Cat 和 Dog,属于 Animal 工厂的产品;Male 和 Female 属于 Person 工厂的产品。所以需要实现 2 个工厂类:Animal 和 Person。

由于工厂类上面还有个超级工厂,为了方便工厂类生产实体,工厂类应该提供生产实体的方法接口。

为了更好的约束工厂类的实现,先实现一个抽象工厂类:

代码语言:javascript
复制
class AbstractFactory {
    getPerson() {
        throw new Error("子类请实现接口");
    }

    getAnimal() {
        throw new Error("子类请实现接口");
    }
}

接下来,Animal 和 Dog 实现抽象工厂类(AbstractFactory):

代码语言:javascript
复制
class PersonFactory extends AbstractFactory {
    getPerson(person) {
        person = person.toLocaleLowerCase();
        switch (person) {
            case "male":
                return new Male();
            case "female":
                return new Female();
            default:
                break;
        }
    }

    getAnimal() {
        return null;
    }
}

class AnimalFactory extends AbstractFactory {
    getPerson() {
        return null;
    }

    getAnimal(animal) {
        animal = animal.toLocaleLowerCase();
        switch (animal) {
            case "cat":
                return new Cat();
            case "dog":
                return new Dog();
            default:
                break;
        }
    }
}

实现“超级工厂”

超级工厂的实现没什么困难,如下所示:

代码语言:javascript
复制
class Factory {
    constructor(choice) {
        choice = choice.toLocaleLowerCase();
        switch (choice) {
            case "person":
                return new PersonFactory();
            case "animal":
                return new AnimalFactory();
            default:
                break;
        }
    }
}

看看怎么使用超级工厂

实现了那么多,还是要看用例才能更好理解“超级工厂”的用法和设计理念:

代码语言:javascript
复制
/**
 * 以下是测试代码
 */

// 创建person工厂
const personFactory = new Factory("person");
// 从person工厂中创建 male 和 female 实体
const male = personFactory.getPerson("male"),
    female = personFactory.getPerson("female");
// 输出测试
male.run();
female.run();

// 创建animal工厂
const animalFactory = new Factory("animal");
// 从animal工厂中创建 dog 和 cat 实体
const dog = animalFactory.getAnimal("dog"),
    cat = animalFactory.getAnimal("cat");
// 输出测试
dog.run();
cat.run();

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是抽象工厂模式?
  • 如何实现抽象工厂模式?
    • 准备实体类
      • 准备工厂类
        • 实现“超级工厂”
          • 看看怎么使用超级工厂
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档