java 设计模式--创建者模式

news/2025/2/13 20:04:54/

参考:Java常见设计模式总结

概念

概念理解一:将复杂对象的创建过程分解在不同的方法中,不同的创建过程组装成不同对象。对象的创建与产品本身分离开,使得对象的创建过程更加清晰。例如:旅游套餐售卖场景。
一个套餐大概会由机票、车票、酒店、景点门票组成。
套餐A: 机票1 + 酒店1 + 景点门票1
套餐B: 车票1 + 景点门票2
套餐C: 机票1 + 酒店1
等等
概念理解二:如果对象的构造的入参十分复杂时,构造对象需要转为链式写法时
第三方库举例:
1、由于产品的构造函数参数太多或者组合方式太多
Mybaitis 和 SqlSessionFactoryBuilder
2、将 set 方法转成链式写法
StringBuilder,StringBuffer.append()方法

抽象建造者 Builder:相当于建筑蓝图,声明了创建 Product 对象的各个部件指定的抽象接口。
具体建造者 ConcreteBuilder:实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
指挥者 Director:构建一个使用 Builder 接口的对象。主要有两个作用,一是隔离用户与对象的生产过程,二是负责控制产品对象的生产过程。
产品角色 Product:被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

抽象构造者

@Data
public abstract class Builder {Package pack = new Package();public abstract void buildAirTicket();public abstract void buildHotel();public abstract void buildTripTicket();public abstract void buildCarTicket();public Package getPack(){return pack;}
}

套餐A具体的构造者 PackageAConcreteBuilder

@Data
public class PackageAConcreteBuilder extends Builder {
//    套餐A: 机票1 + 酒店1 + 景点门票1@Overridepublic void buildAirTicket() {AirTicket airTicket1 = new AirTicket(1000, 999, "机票1", "0001", 200);pack.setAirTicket(airTicket1);}@Overridepublic void buildHotel() {Hotel hotel1 = new Hotel(300, 999, "酒店1", 2);pack.setHotel(hotel1);}@Overridepublic void buildTripTicket() {TripTicket tripTicket1 = new TripTicket(50, 9999, "景点门票1");pack.setTripTicket(tripTicket1);}@Overridepublic void buildCarTicket() {return;}@Overridepublic Package getPack() {return super.getPack();}
}

套餐B具体的构造者 PackageBConcreteBuilder

@Data
public class PackageBConcreteBuilder extends Builder{
//    套餐B: 车票1 + 景点门票2@Overridepublic void buildAirTicket() {}@Overridepublic void buildHotel() {}@Overridepublic void buildTripTicket() {TripTicket tripTicket2 = new TripTicket(30, 9999, "景点门票2");pack.setTripTicket(tripTicket2);}@Overridepublic void buildCarTicket() {CarTicket carTicket1 = new CarTicket(50, 9999, "车票1","0876");pack.setCarTicket(carTicket1);}@Overridepublic Package getPack() {return super.getPack();}
}

套餐模型对象类 Package 相当于图中的 Product

@Data
public class Package {AirTicket airTicket;Hotel hotel;TripTicket tripTicket;CarTicket carTicket;public Package() {}public Package(AirTicket airTicket, Hotel hotel, TripTicket tripTicket, CarTicket carTicket) {this.airTicket = airTicket;this.hotel = hotel;this.tripTicket = tripTicket;this.carTicket = carTicket;}
}

构造者

@Data
public class SystemDirector {private Builder builder;public void setBuilder(Builder builder){this.builder = builder;}public Package ConcreteBuilder(){builder.buildAirTicket();builder.buildHotel();builder.buildCarTicket();builder.buildTripTicket();return builder.getPack();}
}

如何使用

public static void main(String[] args){SystemDirector systemDirector = new SystemDirector(); // 指挥者PackageAConcreteBuilder packageABuilder = new PackageAConcreteBuilder();PackageBConcreteBuilder packageBBuilder = new PackageBConcreteBuilder();systemDirector.setBuilder(packageABuilder);// 指挥操作套餐APackage packageA = systemDirector.ConcreteBuilder();//套餐A的具体构造者创造对象     log.info("packageA,airTicket:{},hotel:{},tripTicket:{}",packageA.airTicket.getName(),packageA.hotel.getName(),packageA.tripTicket.getName());systemDirector.setBuilder(packageBBuilder);// 指挥操作套餐BPackage packageB = systemDirector.ConcreteBuilder();//套餐B的具体构造者创造对象log.info("packageB,carTicket:{},tripTicket:{}",packageB.carTicket.getName(), packageB.tripTicket.getName());}

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

相关文章

Video-LLaMa:利用多模态增强对视频内容理解

在数字时代,视频已经成为一种主要的内容形式。但是理解和解释视频内容是一项复杂的任务,不仅需要视觉和听觉信号的整合,还需要处理上下文的时间序列的能力。本文将重点介绍称为video - llama的多模态框架。Video-LLaMA旨在使LLM能够理解视频中…

数据帧转发过程中IP地址及MAC地址的变化

数据帧在交换机间转发 帧经过交换机时,其源、目标MAC是不会变的。 交换机内部的CPU会在每个端口成功连接时,通过将MAC地址和端口对应,形成一张MAC表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不…

基于Istio的灰度发布改造流程

背景 在多人开发的应用团队中,每个人需要基于发布分支(master分支)拉出自己的特性开发分支,那么如何做到发布到测试环境中而互不干扰呢。 对于k8s开发环境来说,即使每个版本启动一个pod来隔离,但是也无法做…

基于Python的高校学生学业预警系统的设计与实现

博主介绍:擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例…

Python读取EXCEL数据绘制直方图

#excel to plt.py 功能1:读取存于excel的数据 功能2:绘制图直方图 import xlwings as xw import pandas as pd import matplotlib.pyplot as plt pd.set_option(display.max_columns, None) #解决表格多列时中间省略显示问题 pd.set_option(display.…

c# 从零到精通 读取连接数据库-并将读取到的数据添加到dataGridView1 选中状态 全选

c# 从零到精通 读取连接数据库-并将读取到的数据添加到dataGridView1 选中状态 全选 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System…

使用御剑扫描网站

今天我们来用御剑这个扫描工具扫描 http://43.138.211.45这个网站 1.首先打开御剑,点击添加,输入http://43.138.211.45 2.选择get模式,线程选择50,超时选择5,配置文件选择php,并开始扫描。

守卫剑阁 代码

1.//买家无敌 call SetUnitInvulnerable(GetBuyingUnit(),true) 2.//创建物品在孔明处 call CreateItem(1227896920,GetRectCenterX(FK),GetRectCenterY(FK)) 转载于:https://www.cnblogs.com/jhcla/p/6049689.html