Javascript设计模式-04-工厂模式

Javascript设计模式 - 04 -工厂模式(简单工厂,抽象工厂)

简介

工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类,该模式使一个类的实例化延迟到了子类,而子类可以重写接口方法以便创建的时候指定自己的对象类型

个人理解

简单工厂模式接受一个命令,然后将命令的处理分离出去,命名处理函数接受不同的命令,或者根据不同的环境返回不同的对象,返回的对象会在工厂中绑定一些公用的‘零件’(主要是方法)最后返回一个加工后的商品的实例

    // 创建不同交通工具 Transport
    function Car() {
        this.name = 'transport-car';
    }

    function Train() {
        this.name = 'transport-train';
    }

    function Bike() {
        this.name = 'transport-bike';
    }

    // 定义命令处理函数
    function selectTransport(type) {
        var transport;

        switch (type) {
            case 'car':
                transport = new Car();
                break;
            case 'train':
                transport = new Train();
                break;
            case 'bike':
                transport = new Bike();
                break;
            default:
                transport = new Car();
                break;
        }

        return transport;
    }

    // 创建工厂
    function Factory() {
        this.count = 0;
    }

    Factory.prototype.create = function (type) {
        var me = this;
        var transport = selectTransport(type);
        // 绑定公有的方法
        transport.intro = function () {
            console.log('this is ' + this.name + ' count: ' + me.count++);
        }

        return transport;
    }

    // 实例化工厂
    var factory = new Factory();
    // 开始创建
    var train = factory.create('train');
    train.intro(); // this is transport-train count: 0
    // 再创建
    var bike = factory.create('bike');
    bike.intro(); // this is transport-bike count: 1

抽象工厂模式相比于简单工厂模式,真正使用的‘工厂’,是我们抽象出来的工厂的一个子类,同时,命令处理函数不在定义在外边,而是定义在子类的原型上,这样有不同的组装需求,只需要从抽象工厂上继承一个子类,在子类中定义新的命令处理方式就行了。

    // 创建一个用于继承的函数
    function extend(subClass, superClass) {
        // 定义一个中介类
        function F() {}
        // 原型指向父类的原型
        F.prototype = superClass.prototype;
        /*
            子类的原型指向中介类的一个实例,实现继承
            由于 subClass 的原型指向的是 F 的一个实例 而不是 F.prototype 也就是 父类的原型,
            所以子类原型的修改不会将父类的原型也修改掉
        */ 
        subClass.prototype = new F();
        // 上一步得到的子类的原型的构造函数是 Factory ,这里需要把它变回自己本身
        subClass.prototype.constructor = subClass;
    }

    // 创建不同交通工具 Transport
    function Car() {
        this.name = 'transport-car';
    }

    function Train() {
        this.name = 'transport-train';
    }

    function Bike() {
        this.name = 'transport-bike';
    }

    // 创建工厂
    function Factory() {
    }

    Factory.prototype.create = function (type) {
        var me = this;
        // 注:这里改为了调用自身的 selectTransport 方法,Factory 本身没有这个方法,这个方法是子类定义的
        var transport = this.selectTransport(type);
        // 绑定公有的方法
        transport.intro = function () {
            console.log('this is ' + this.name + ' count: ' + me.count++);
        }

        return transport;
    }

    // 新增子类的创建
    function TransportFactory() {
        this.count = 0;
    };
    extend(TransportFactory, Factory); // 继承工厂
    // 子类定义 selectTransport 方法,定义前一定要先继承父类,否则会被覆盖
    TransportFactory.prototype.selectTransport = function (type) {
        var transport;

        switch (type) {
            case 'car':
                transport = new Car();
                break;
            case 'train':
                transport = new Train();
                break;
            case 'bike':
                transport = new Bike();
                break;
            default:
                transport = new Car();
                break;
        }

        return transport;
    }


    // 实例化工厂
    var factory = new TransportFactory();
    // 开始创建
    var train = factory.create('train');
    train.intro();
    // 再创建
    var bike = factory.create('bike');
    bike.intro();

文章列表

  1. javascript设计模式 – 设计原则
  2. JavaScript设计模式–高阶函数
  3. Javascript 设计模式 - 01 - 原型模式
  4. Javascript 设计模式 - 02 - 单例模式
  5. Javascript 设计模式 - 03 - 建造者模式
  6. Javascript 设计模式 - 04 - 工厂模式
  7. Javascript 设计模式 - 05 - 外观模式
  8. Javascript 设计模式 - 06 - 代理模式
  9. Javascript 设计模式 - 07 - 观察者模式(发布订阅模式)
  10. Javascript 设计模式 - 08 - 策略模式
  11. Javascript 设计模式 - 09 - 命令模式
  12. Javascript 设计模式 - 10 - 迭代器模式
  13. Javascript 设计模式 - 11 - 职责链模式
  14. Javascript 设计模式 - 12 - 适配器模式
  15. Javascript 设计模式 - 13 - 模板方法
  16. Javascript 设计模式 - 14 - 组合模式
  17. Javascript 设计模式 - 15 - 享元模式
  18. Javascript 设计模式 - 16 - 中介者模式
  19. Javascript 设计模式 - 17 - 装饰者模式
  20. Javascript 设计模式 - 18 - 状态模式
参考文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值