当前位置:网站首页>建造者模式(Builder Pattern)
建造者模式(Builder Pattern)
2022-08-03 05:09:00 【飞四海】
主要作用:
可以使多个简单的对象,一步一步构建成一个复杂的对象
应用实例:
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
举例:
我们可以假设 我们去饭店:
饭店有沙拉和冷饮。
- 沙拉可以是素沙拉或者是肉沙拉,他们在放在一次性纸盒里面。
- 冷饮有胡萝卜汁或者黄瓜汁装在瓶子里面。
我们可以有一个食物菜单,和食物包装类,以及他们的实现。
我们在创建一顿饭需要定哪个菜单,也就是怎么去Builder,之后用这个Builder去创建一顿饭。
1、创建一个菜单和包装接口
/** * @description: 创建一个菜单 */
public interface Item {
public String name();
public Packing packing();
public float price();
}
/** * @description: 包装 */
public interface Packing {
public String pack();
}
2、实现包装接口,创建瓶子和盒子两个包装
/** * @description: 盒子 继承包装Packing */
public class PBottle implements Packing {
@Override
public String pack() {
return "瓶子";
}
}
/** * @description: 包装纸 */
public class PWrapper implements Packing {
@Override
public String pack() {
return "包装纸";
}
}
3、实现菜单接口Item,实现基础功能,沙拉+冷饮
/** * @description: 沙拉 —— 实现 Item 接口的抽象类 */
public abstract class Salad implements Item {
@Override
public Packing packing() {
// 包装 返回 包装纸
return new PWrapper();
}
@Override
public abstract float price();// 价格
}
/** * @description: 冷饮 —— 实现 Item 接口的抽象类 */
public abstract class LJuice implements Item {
@Override
public Packing packing() {
return new PBottle(); // 盒子 装 冷饮
}
@Override
public abstract float price();
}
4、扩展沙拉+冷饮的类
/** * @description: 鸡肉沙拉 */
public class SLChicken extends Salad {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "鸡肉沙拉";
}
}
/** * @description: 素食沙拉 */
public class SLVeg extends Salad {
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "素食沙拉";
}
}
/** * @description: 冷饮黄瓜汁 */
public class LHGJuice extends LJuice {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "黄瓜汁";
}
}
/** * @description: 萝卜汁 */
public class LLBJuice extends LJuice {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "萝卜汁";
}
}
5、在创建一个Meal类,表示为一顿饭
public class Meal {
private List<Item> items = new ArrayList<Item>();
public void addItem(Item item){
items.add(item);
}
public float getCost(){
float cost = 0.0f;
for (Item item : items) {
cost += item.price();
}
return cost;
}
public void showItems(){
for (Item item : items) {
System.out.print("Item : "+item.name());
System.out.print(", 包装 : "+item.packing().pack());
System.out.println(", 价格 : "+item.price());
}
}
}
6、创建一个Builder,我们要把这一顿饭给 构建出来
/** * @description: 创建一个 MealBuilder 类,他就是组装每一顿饭 吃什么的类,可以当作下单 */
public class MealBuilder {
/** * 素的 * @return */
public Meal prepareSu (){
Meal meal = new Meal();
meal.addItem(new SLVeg());
meal.addItem(new LHGJuice());
return meal;
}
/** * 肉的 * @return */
public Meal prepareRou (){
Meal meal = new Meal();
meal.addItem(new SLChicken());
meal.addItem(new LLBJuice());
return meal;
}
}
最后测试
public class BuilderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
Meal vegMeal = mealBuilder.prepareSu();
System.out.println("蔬菜沙拉套餐");
vegMeal.showItems();
System.out.println("总额: " +vegMeal.getCost());
Meal nonVegMeal = mealBuilder.prepareRou();
System.out.println("\n\n 肉食沙拉套餐");
nonVegMeal.showItems();
System.out.println("总额: " +nonVegMeal.getCost());
}
}
打印:
蔬菜沙拉套餐
Item : 素食沙拉, 包装 : 包装纸, 价格 : 25.0
Item : 黄瓜汁, 包装 : 瓶子, 价格 : 30.0
总额: 55.0
肉食沙拉套餐
Item : 鸡肉沙拉, 包装 : 包装纸, 价格 : 50.5
Item : 萝卜汁, 包装 : 瓶子, 价格 : 35.0
总额: 85.5
基本上就是这些了,总结一下建造者模式就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要关注与零件装配的顺序。
边栏推荐
- 2022暑假牛客多校联赛第一场
- BIOTIN ALKYNE CAS: 773888-45-2 Price, Supplier
- Interface test Mock combat (2) | Combined with jq to complete batch manual Mock
- MOSN 反向通道详解
- BIOTIN ALKYNE CAS:773888-45-2价格,供应商
- js implements a bind function
- 传统企业如何转型社交电商,泰山众筹的玩法有哪些?
- 接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
- 力扣561. 数组拆分
- Interface Test Framework Practice | Process Encapsulation and Test Case Design Based on Encrypted Interface
猜你喜欢

私域流量时代来临,电商企业如何布局?

接口和抽象

常见荧光染料修饰多种基团及其激发和发射波长数据一览数据

BIOTIN ALKYNE CAS: 773888-45-2 Price, Supplier

常见亲脂性细胞膜染料DiO, Dil, DiR, Did光谱图和实验操作流程

Build your own web page on the Raspberry Pi (2)

OSI的分层特点、传输过程与三次握手、四次挥手、tcp与udp包头的描述

Talking about GIS Data (5) - Geographic Coordinate System

刚上线就狂吸70W粉,新型商业模式“分享购”来了,你知道吗?

typescript47-函数之间的类型兼容性
随机推荐
Create a tree structure
接口测试实战| GET/POST 请求区别详解
【 Harmony OS 】 【 ano UI 】 lightweight data storage
Harmony OS ets ArkUI 】 【 】 the development basic page layout and data connection
【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式调起Ability
VR全景展打造专属元宇宙观展空间
Shell条件语句判断
WebSocket的实际应用
Flink状态
High availability, two locations and three centers
[Fine talk] Using native js to implement todolist
tag单调栈-单调栈预备知识-lt.739. 每日温度
typescript39-class类的可见修饰符
DFS对剪枝的补充
三丁基-巯基膦烷「tBuBrettPhos Pd(allyl)」OTf),1798782-17-8
typescript45-接口之间的兼容性
1069 微博转发抽奖 (20 分)(C语言)
技术分享 | 接口自动化测试中如何对xml 格式做断言验证?
【HMS core】【Ads Kit】华为广告——海外应用在国内测试正式广告无法展示
【Harmony OS】【ARK UI】ets use startAbility or startAbilityForResult to invoke Ability