首页 > 其他分享 >9.23

9.23

时间:2024-10-29 17:10:42浏览次数:3  
标签:9.23 return Meal Item Packing java public

建造者模式

建造者模式是一种创建型设计模式,它允许你创建复杂对象的步骤与表示方式相分离。

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。

概要

意图

将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决

在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。

何时使用

当一些基本部件不变,而其组合经常变化时。

如何解决

将变与不变的部分分离开。

关键代码

  • 建造者:创建并提供实例。
  • 导演:管理建造出来的实例的依赖关系和控制构建过程。

应用实例

  • 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的"套餐"。
  • Java 中的 StringBuilder

优点

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
  • 可以更好地控制构建过程,隐藏具体构建细节。
  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

缺点

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。
  • 增加了系统的类和对象数量。

使用场景

  • 需要生成的对象具有复杂的内部结构。
  • 需要生成的对象内部属性相互依赖。

注意事项

与工厂模式的区别是:建造者模式更加关注于零件装配的顺序。

结构

建造者模式包含以下几个主要角色:

  • 产品(Product):要构建的复杂对象。产品类通常包含多个部分或属性。

  • 抽象建造者(Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。

  • 具体建造者(Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。

  • 指导者(Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。

实现

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilderBuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal

建造者模式的 UML 图

步骤 1

创建一个表示食物条目和食物包装的接口。

Item.java

public interface Item { public String name(); public Packing packing(); public float price(); }

Packing.java

public interface Packing { public String pack(); }

步骤 2

创建实现 Packing 接口的实体类。

Wrapper.java

public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } }

Bottle.java

public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }

步骤 3

创建实现 Item 接口的抽象类,该类提供了默认的功能。

Burger.java

public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); }

ColdDrink.java

public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); }

步骤 4

创建扩展了 Burger 和 ColdDrink 的实体类。

VegBurger.java

public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } }

ChickenBurger.java

public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } }

Coke.java

public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } }

Pepsi.java

public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }

步骤 5

创建一个 Meal 类,带有上面定义的 Item 对象。

Meal.java

import java.util.ArrayList; import java.util.List; 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(", Packing : "+item.packing().pack()); System.out.println(", Price : "+item.price()); } } }

步骤 6

创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。

MealBuilder.java

public class MealBuilder { public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }

步骤 7

BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。

BuilderPatternDemo.java

public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " +vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " +nonVegMeal.getCost()); } }

步骤 8

执行程序,输出结果:

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0


Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5

标签:9.23,return,Meal,Item,Packing,java,public
From: https://www.cnblogs.com/wcy1111/p/18513950

相关文章

  • 2024.09.23
        今天学习了Springboot+MyBatis的整体架构,有一些细节的内容还不是很理解但是可以总结出一些流程和方法1.首先创建Springboot项目,在创建的时候添加SpringWeb、Thymeleaf、MyBatis依赖2.当项目创建完成之后,就可以配置数据库的相关内容了在application.yml中server:po......
  • 人工智能教育技术学9.23
    任务一:去除水印(理论部分)‌‌1.水印的功能:(1)版权保护‌:数字水印可以在图像、声音、视频信号中添加某些数字信息,以证明版权归属,防止未经授权的复制和拷贝。‌‌(2)防伪防盗版‌:通过在多媒体数据中嵌入水印,可以有效防止盗版和伪造,保护原创者的权益。‌‌(3)标识来源:在商业应用......
  • C#/.NET/.NET Core技术前沿周刊 | 第 7 期(2024年9.23-9.30)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿,推荐或自荐优质文章/项目/学习资源等。每周一......
  • 2024.9.23 cj 训练总结
    T1这道题目仔细观察就会发现:异或k=1这就很好办,考虑k=1怎么解3124567..........即可。异或,找规律发现有很多数字的异或值为0的。最后的答案是有规律的。不知道什么问题,场上就70分。T2这道题目基本上没啥思路,就是弄了个桶10分。正解:由于这个题目的字符集......
  • 9.23scala中的apply和equal改写
    Scala对象的创建(1)new:使用new关键字创建类的对象(2)伴生对象:使用object关键字创建一个单例对象(3)apply:apply是一个方法,需要在伴生对象中实现这个方法 能够不使用new关键字来创建对象//创建类使用classclassStu(varname:String,vargender:String,varID:String){def......
  • 计算机复习9.23
    关系:一张扁平的二维表,关系应该具备每个分量都不可分的数据(1NF)候选码:某个属性组可以唯一标识一个元组,而其子集不能,候选码中的属性叫主属性主码:从候选码中选取一个称为主码全码:所有属性组合在一起作为这个关系的候选码传统集合:并,交,差,笛卡尔积,差专门关系云算:选择,投影,连接,......
  • 9.23 ~ 9.29
    9.23集训第一天。早晨因为太多人没拿早读资料被老登D了。不是哥们你不早说现在我上哪给你找资料去......
  • 9.23考试总结
    T1简单签到题,考虑一个点从开头移到结尾会减去小于它的数加上大于它的数。所以\(O(nlogn)\)求逆序对,然后\(O(1)\)计算一个数移到最后的答案。#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;#definelllonglongintn,a[N],sum[N],sh[N];llans,jg;......
  • 2024.9.23校测
    T1题目描述如果你有一个长度为n的序列:\(a_1,a_2,a_3,\dots,a_n\),那么它的一个逆序对是一个二元组:\(<i,j>\)满足\(i<j\)且\(a_i>a_j\),其中\(i,j\in[1,n]\)。我们称一个序列所包含的逆序对的个数为这个序列的逆序对数。那么问题来了:我给出一个长度为n......
  • 2024.9.23docker常用命令
    1.容器管理查看运行中的容器:dockerps查看所有容器(包括已停止的):dockerps-a启动容器:dockerstart<container_id或container_name>停止容器:dockerstop<container_id或container_name>重启容器:dockerrestart<container_id或container_name>删除......