摘要:参考文章设计模式之建造者模式一什么是建造者模式建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
参考文章:
java设计模式之建造者模式
一、什么是建造者模式
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。
具体表现为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://www.ucloud.cn/yun/93777.html
摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...
摘要:注意事项声明函数时候处理业务逻辑区分和单例的区别,配合单例实现初始化构造函数大写字母开头推荐注意的成本。简单工厂模式使用一个类通常为单体来生成实例。 @(书籍阅读)[JavaScript, 设计模式] 常见设计模式 一直对设计模式不太懂,花了一下午加一晚上的时间,好好的看了看各种设计模式,并总结了一下。 设计模式简介 设计模式概念解读 设计模式的发展与在JavaScript中的应用 ...
摘要:建造者模式实现建造者模式实现创建抽象建造者类创建具体建造者类。建造者模式使用场景建造者模式使用场景相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
摘要:建造者实现抽象类的所有未实现的方法,具体来说一般是两项任务组建产品返回组建好的产品。 0x01.定义与类型 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道 类型:创建型 实现建造模式的两种方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
阅读 2518·2023-04-26 00:57
阅读 878·2021-11-25 09:43
阅读 2181·2021-11-11 16:55
阅读 2156·2019-08-30 15:53
阅读 3569·2019-08-30 15:52
阅读 1415·2019-08-30 14:10
阅读 3320·2019-08-30 13:22
阅读 1188·2019-08-29 11:18