JavaScript设计模式_js实现建造者模式

时间: 2018-03-28阅读: 1739标签: 模式

什么是建造者模式

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。

具体表现为4个角色

产品(Product):建造的产物
导演(Director):指挥建造的过程,不涉及建造的细节
建造者(Builder):抽象建造过程,规定产品哪些部分需要创建
具体建造者(ConceteBuilder):实现Builder,实现产品各个部分的建造,并提供产品

使用场景:

需要生成的对象有复杂的内部结构,且各部分都会根据需求发生组装变化
缺点:
1、当产品内部非常复杂,需要用大量的具体建造者,导致系统庞大
2、产品要有共同点,范围受限制


下面举个例子:肯德基点餐环节,角色对应分别如下
Product:一餐食物(Meal)
Director:前台销售员(Seller)
Builder:抽象建造者(Builder)
ConceteBuilder:厨师(Cook)


首先实现一些食物

// Food 食物抽象类
class Food {
    constructor() {
        this.name = null;
        this.price = null;
    }
}
// 汉堡
class Burger extends Food {
    constructor() {
        super();
        this.name = '汉堡';
        this.price = 16;
    }
}
// 鸡翅
class ChickenWing extends Food {
    constructor() {
        super();
        this.name = '鸡翅';
        this.price = 12;
    }
}
// 可乐
class Coke extends Food {
    constructor() {
        super();
        this.name = '可乐';
        this.price = 6;
    }
}


产品Product
一桌餐饭可以有任意数量的任意组合

// Product
class Meal {
    constructor() {
        this.foods = [];
    }
    
    addFood(item) {
        this.foods.push(item);
    }
    showPrice() {
        var i = this.foods.length,
            price = 0;
        while(i--) {
            price += this.foods[i].price;
        }

        return price;
    }
}


抽象建造类Builder
规范各部分的建造

// Builder
class Builder {
    cookBurger() {}
    cookWing() {}
    cookCoke() {}
    finishCook() {}
}


具体建造类
厨师负责各个食物的烹饪,并添加到meal里

// ConceteBuilder
class Cook extends Builder {
    constructor() {
        super();
        this.meal = new Meal();
    }

    cookBurger(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new Burger());
        }
    }
    cookWing(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new ChickenWing());
        }
    }
    cookCoke(number) {
        for (var i = 0; i < number; i++) {
            this.meal.addFood(new Coke());
        }
    }
    finishCook() {
        return this.meal;
    }
}


导演Director
负责通知厨房需要烹饪啥啥啥。

// Director
class Seller {
    constructor() {
        this.builder = null;
    }

    bindCook(builder) {
        this.builder = builder;
    }
    placeOrder(burgerAmount, wingAmount, cokeAmount) {
        this.builder.cookBurger(burgerAmount);
        this.builder.cookWing(wingAmount);
        this.builder.cookCoke(cokeAmount);

        var meal = this.builder.finishCook();
        console.log('总价:' + meal.showPrice());
        return meal;
    }
}


最后模拟一次下单场景

var seller = new Seller();
var cook = new Cook();
seller.bindCook(cook);
seller.placeOrder(1, 2, 3); // 58


总结:

易于解耦 :将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象
易于精确控制对象的创建 :将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
易于拓展 :增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“

来源:https://segmentfault.com/a/1190000014035704
站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/559

js设计模式——策略模式

策略模式是JavaScript设计模式中行为型的设计模式;定义一系列算法,并将这些算法各自封装成策略类(方法),然后将不变的部分和变化的部分分离开来,并且这些算法可以相互替换

从ES5 到 TypeScript单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型 (Creational) 模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类

React组件设计模式-组合组件

这种模式本质上解决的是组件之间传值的问题。但是它对于传值以及一些内部操控的逻辑封装得更严密。场景:希望减少上下级组件之间props的传递,简单来说就是不用传做显式地传值,来达到组件之间相互通信的目的

js虚拟代理模式

虚拟代理把开销大的操作等到需要执行创建的时候再去执行创建,用户可以放心使用代理,他只关心是否能得到结果,在任何可以使用本体的地方都可以使用代理代替本体

TypeScript 设计模式之单例模式

单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的 window 对象等。单例模式用于保证一个类仅有一个实例,并提供一个访问它的全局访问点。

js模板模式

模板模式是抽象父类定义了子类需要重写的相关方法。 而这些方法,仍然是通过父类方法调用的。 根据描述,“模板”的思想体现在:父类定义的接口方法。

浅谈js抽象工厂模式

简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 比如你去专门卖鼠标的地方你可以买各种各样的鼠标

发布订阅和观察者模式的区别

有些人认为观察者模式就是发布订阅模式,实际上观察者模式是包含了订阅发布模式,发布订阅模式只是观察者模式中的一种。观察者模式是观察者和被观察者之间的通信,而发布订阅模式中间增加了一个中转层

Js命令模式

命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式由三种角色构成:发布者、接收者、命令对象

JS中的单例模式及单例模式原型类的实现

现在页面上的这个按钮每被点击一下就会生成一个div,但是现在如果这个div是登录框,我当然就会想要这段函数只生成一个,这时候就可以用到单例模式的思想:让一个类只会生成一个实例。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!