String核心设计模式——建造者模式

news/2024/9/19 4:55:07/ 标签: 设计模式, 建造者模式, java

 

目录

建造者模式

优点

缺点

使用场景

结构

步骤 1

java-toc" style="margin-left:80px;">Item.java

java-toc" style="margin-left:80px;">Packing.java

步骤 2

java-toc" style="margin-left:80px;">Wrapper.java

java-toc" style="margin-left:80px;">Bottle.java

步骤 3

java-toc" style="margin-left:80px;">Burger.java

java-toc" style="margin-left:80px;">ColdDrink.java

步骤 4

java-toc" style="margin-left:80px;">VegBurger.java

java-toc" style="margin-left:80px;">ChickenBurger.java

java-toc" style="margin-left:80px;">Coke.java

java-toc" style="margin-left:80px;">Pepsi.java

步骤 5

java-toc" style="margin-left:80px;">Meal.java

步骤 6

java-toc" style="margin-left:80px;">MealBuilder.java

步骤 7

java-toc" style="margin-left:80px;">BuilderPatternDemo.java

步骤 8


建造者模式

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

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

优点

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

缺点

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

使用场景

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

结构

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

  • 产品(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

步骤 1

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

java">Item.java

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

java">Packing.java

java">public interface Packing {public String pack();
}

步骤 2

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

java">Wrapper.java

java">public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}

java">Bottle.java

java">public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}

步骤 3

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

java">Burger.java

java">public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();
}

java">ColdDrink.java

java">public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();
}

步骤 4

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

java">VegBurger.java

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

java">ChickenBurger.java

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

java">Coke.java

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

java">Pepsi.java

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

步骤 5

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

java">Meal.java

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 对象。

java">MealBuilder.java

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)。

java">BuilderPatternDemo.java

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.0Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5

 


http://www.ppmy.cn/news/1520814.html

相关文章

Proteus 仿真设计:开启电子工程创新之门

摘要&#xff1a; 本文详细介绍了 Proteus 仿真软件在电子工程领域的广泛应用。从 Proteus 的功能特点、安装与使用方法入手&#xff0c;深入探讨了其在电路设计、单片机系统仿真、PCB 设计等方面的强大优势。通过具体的案例分析&#xff0c;展示了如何利用 Proteus 进行高效的…

CSP-CCF ★201512-2 消除类游戏★

一、问题描述 问题描述 消除类游戏是深受大众欢迎的一种游戏&#xff0c;游戏在一个包含有n行m列的游戏棋盘上进行&#xff0c;棋盘的每一行每一列的方格上放着一个有颜色的棋子&#xff0c;当一行或一列上有连续三个或更多的相同颜色的棋子时&#xff0c;这些棋子都被消除。当…

Spring的核心设计模式——工厂模式

目录 工厂模式 工厂模式的类型 优点 缺点 使用场景 结构 实现 步骤 1 步骤 2 步骤 3 步骤 4 步骤 5 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的…

Scratch教师节:给老师的一封信

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 【Scratch教师节特别献礼】—— 给老师的一封信&#xff1a;编程之光&#xff0c;照亮梦想之路 在这个金秋送爽、硕果累累的季节里&#xff0c;我们迎来了一个特别而温馨的日子——教师节。在这个充满感激与敬意的…

无人机纪录片航拍认知

写在前面 博文内容为纪录片航拍简单认知&#xff1a;纪录片 航拍镜头&#xff0c;航拍流程&#xff0c;航拍环境条件注意事项介绍航拍学习书籍推荐《无人机商业航拍教程》读书笔记整理&#xff0c;适合小白认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于…

使用模板:封装栈、队列

栈 #include <iostream>using namespace std;//封装栈 template<typename T> class myStack { private:T *data;int top-1; //记录栈顶元素下标int size; //栈的大小 public:myStack():size(10){data new T[size];top-1;}myStack(int size){data…

Axure RP实战:打造高效文字点选验证码

Axure RP实战&#xff1a;打造高效文字点选验证码 前言 在数字时代&#xff0c;网络安全和用户体验是设计在线表单时的两大关键考量。 验证码作为一种验证用户身份的技术&#xff0c;已经从简单的数字和字母组合&#xff0c;发展到了更为复杂和用户友好的形式。 今天&#…

实用的4大网站建设模板资源网站

WP模板牛 (wpniu.com ) WP模板牛是一个综合性的WordPress建站模板分享网站&#xff0c;提供中文WP模板、外贸WP模板、免费WP模板等100多个WordPress模板。使用这些模板可以快速搭建起属于自己的WordPress网站。 模板之家 (mymoban.com ) 模板之家是一个提供各种网站模板资源…

设计者模式之访问者模式

1.访问者模式概述 允许你在不改变对象结构中的元素类的前提下&#xff0c;向对象结构中的元素增加新的行为。这种模式将数据结构与作用于结构上的操作分离&#xff0c;从而使得我们可以独立地改变数据结构和操作。 2.访问者模式的组成部分 1&#xff09;Visitor&#xff08;访…

【C++】STL—vector的使用

目录 前言vector的常见构造迭代器的使用vector空间增长问题vector的增删查改尾插和尾删findinsert和erase 前言 vector是表示可变大小数组的序列容器。它就像数组一样&#xff0c;采用连续的存储空间来存储元素&#xff0c;且它的大小可以动态改变。并且vector在访问元素时也非…

【护网相关知识】

文章目录 一、什么是防火墙1.WAF2.IDS入侵检测系统3.IPS入侵防御系统4.安全工具5.OSI参考模型6.常见的网络攻击方式7.OWSPTOP10常见漏洞及基本原理8.常见漏洞及其基本原理9.流量分析10.域名系统11.渗透测试报告编写及安全事件处置 一、什么是防火墙 二代防火墙 三代防火墙部署…

十五章 为xxl-job这个项目创建一个 helm

为xxl-job这个项目创建一个 helm 1. 创建 Helm Chart 在当前目录下创建一个名为 xxl-job-admin 的 Helm Chart&#xff1a; helm create xxl-job-admin这会生成一个包含 Chart.yaml、values.yaml、templates 等文件夹的目录。 2. 自定义 Helm Chart 将之前提供的 values.y…

橘子学ES实战操作之管道类型Ingest pipelines的基本使用

简介 我们在使用ES的时候&#xff0c;经常的用法就是把其他数据源比如Mysql的数据灌到ES中。 借用ES的一些功能来提供数据的全文检索以及聚合分析之类的功能。 在这个灌数据的过程中&#xff0c;我们经常会对数据做一些治理&#xff0c;类似ETL的能力。然后把治理后的数据写入…

查看 mysql 密码过期策略,设置永不过期

SELECT user, host, password_expired, password_lifetime FROM mysql.user WHERE user username;如果 password_expired 为 Y&#xff0c;则密码已过期。字段 password_lifetime 存储密码的寿命&#xff0c;以天为单位&#xff0c;这个可以用来作为是否到期的依据。 修改密码…

【APP自动化】Appium 环境搭建

1 基础环境 安装 node.js (1) 安装node.js 安装的是10版本&#xff0c;node-v10.16.0-x64&#xff0c;node.js安装比较简单&#xff0c;直接采用默认选项即可&#xff0c;路径的话&#xff0c;可以自己更改下。 (2) 添加Path环境变量 (3) 验证node.js是否安装成功 可以在CMD…

力扣122-买卖股票的最佳时机 II(java详细题解)

题目链接&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法&#xff1a;局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优…

数据库课程设计mysql

1. 简介 1.1. 概述 MySQL是一个开源的关系型数据库管理系统(RDBMS),它使用了Structured Query Language(SQL)来操作和查询数据。MySQL由瑞典MySQL AB公司开发,后来被Sun微系统收购,最后由甲骨文公司接管。MySQL支持多种平台,如Windows、Linux、Unix等,并且在Web应用…

pikachu文件包含漏洞靶场

漏洞基础 程序在引用文件的时&#xff0c;引用的文件名存在用户可控的情况&#xff0c;传入的文件名没有经过合理的校验或校验不严&#xff0c;从而操作了预想之外的文件&#xff0c;就有可能导致文件泄漏和恶意的代码注入&#xff1b; 本地文件包含 指通过相对路径/绝对路…

自动驾驶---什么是Frenet坐标系?

1 背景 为什么提出Frenet坐标系&#xff1f;Frenet坐标系的提出主要是为了解决自动驾驶系统在路径规划的问题&#xff0c;它基于以下几个原因&#xff1a; 符合人类的驾驶习惯&#xff1a; 人类驾驶员在驾驶过程中&#xff0c;通常不会关心自己距离起点的横向和纵向距离&#x…

二叉树的中序遍历(递归非递归方法)

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 对于二叉树的中序遍历就是左中右&#xff0c;这么记住就行&#xff0c;前序后序就是把重放在前面和后面的区别&#xff0c;…