当前位置:网站首页>建造者模式(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
基本上就是这些了,总结一下建造者模式就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要关注与零件装配的顺序。
边栏推荐
- Kotlin-Flow common encapsulation class: the use of StateFlow
- 2022/08/02 Study Notes (day22) Multithreading
- 探索性测试的概念及方法
- typescript49-交叉类型
- Technology Sharing | How to do assertion verification for xml format in interface automation testing?
- 私域流量引流方法?分享购火爆的商业模式,你值得拥有
- 安装IIS服务(Internet信息服务(Internet Information Services,简写IIS,互联网信息服务)
- 修饰生物素DIAZO-生物素-PEG3-DBCO|重氮-生物素-三聚乙二醇-二苯基环辛炔
- 13.
lt.647. Palindromic substring + lt.516. Longest palindrome subsequence - 【Harmony OS】【ARK UI】Date 基本操作
猜你喜欢

Interface Test Framework Practice (4) | Get Schema Assertion

Online password generator tool recommendation

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

Fluorescent marker peptides FITC/AMC/FAM/Rhodamine TAMRA/Cy3 / Cy5 / Cy7 - Peptide

How to use the interface management tool YApi?Beautiful, easy to manage, super easy to use

高可用 两地三中心

Exception(异常) 和 Error(错误)区别解析

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

Apache DolphinScheduler版本2.0.5分布式集群的安装

Concepts and Methods of Exploratory Testing
随机推荐
c语言结构体中的冒泡排序
VR全景展打造专属元宇宙观展空间
接口和抽象
typescript43-类型兼容性说明
1069 微博转发抽奖 (20 分)(C语言)
接口测试实战| GET/POST 请求区别详解
WinForm的控件二次开发
Interface test framework combat (1) | Requests and interface request construction
2022暑假牛客多校联赛第一场
Kotlin-Flow common encapsulation class: the use of StateFlow
技术分享 | 接口自动化测试中如何对xml 格式做断言验证?
Talking about GIS Data (5) - Geographic Coordinate System
接口和协议
Harmony OS Date ano UI 】 【 】 the basic operation
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
Get the Ip tool class
【Harmony OS】【ARK UI】Date 基本操作
JS bottom handwriting
typescript40-class类的保护修饰符
js中的闭包