建造者模式

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,... 阅读详情

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

意图:

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

主要解决:

  • 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定

何时使用:

  • 一些基本部件不会变,而其组合经常变化的时候

如何解决:

  • 将变与不变分离开

关键代码:

  • 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系

应用实例:

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

优点:

  • 建造者独立,易扩展

  • 便于控制细节风险

缺点:

  • 产品必须有共同点,范围有限制
  • 如内部变化复杂,会有很多的建造类

使用场景:

  • 需要生成的对象具有复杂的内部结构

  • 需要生成的对象内部属性本身相互依赖

注意事项:

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

实现

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal
在这里插入图片描述

  1. 创建一个表示食物条目和食物包装的接口
    //Item.java
    public interface Item {
       public String name();
       public Packing packing();
       public float price();
    }

    //Packing.java
    public interface Packing {
       public String pack();
    }
  1. 创建实现 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";
       }
    }
  1. 创建实现 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();
    }
  1. 创建扩展了 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";
       }
    }
  1. 创建一个 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());
          }
       }
    }
  1. 创建一个 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;
       }
    }
  1. BuiderPatternDemo 使用 MealBuider 来演示建造者模式(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());
       }
    }
INCA刷写App文件必看:A2l文件配置与ProF文件安装详解(2023最新版) 本文深入解析了使用INCA进行ECU应用程序刷写时,A2l文件配置与ProF文件安装的关键细节与避坑指南。重点阐述了A2l文件必须与待刷写二进制文件严格匹配的核心逻辑,以及ProF文件与Bootloader版本强相关的安装策略,帮助开发者解决刷写过程中的常见失败问题,确保刷写流程的稳定与可靠。 阅读详情

相关推荐

V2签名预装失败原因及解决方案

GOOGLE最新的GTS要求targetSdkVersion 大于30的APK必须使用V2及以上签名。 但实际在预装过程中,GTS测试会失败。 后面发现这是由于预装方式的原因造成的。原来的预装方式是使用APK,指定APK使用预签名的方式。Android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := DKTest LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS

zyfzhangyafei的专栏 6305

五种创建型模式

单例模式、建造者模式、抽象工厂模式、工厂方法模式、原型模式 一、单例模式 如何有效地进行程序初始化

m0_58803607的博客 2374

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

创造型设计模式详解与总结

设计模式是软件开发中的一个重要概念,旨在提供通用的解决方案来应对常见的设计问题。设计模式可以分为三大类:创造型模式、结构型模式和行为型模式。在这些模式中,**创造型设计模式**(Creational Design Patterns)专注于对象的创建,确保系统在面对复杂对象构建时具有更好的灵活性和可维护性。

fudaihb的博客 2109

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码)

本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。

weixin_30698297的博客 475

操作系统期末大题类型题解

额,OS主要这回考程序分析题,PV操作、生产者消费者啊,哲学家进餐问题,死锁问题啊,如何避免死锁,经典银行家算法,页面置换算法啥的,磁盘调度......总计还有很多,就不一一说了 PV操作 谈到PV操作,首先要了解什么是信号量,其实就是用来解决互斥与同步问题的,分为原语wait(S)和signal(S),也就是我们常说的PV操作,在这里给出王道上的概念 wait(S){ while(S>0) S=S-1; } signal(S){ S=S+1; } 记录型信号量

ZXxxiaoxuan的博客 795

设计模式的总结二:创造型模式

java设计模式总结二:创造型模式

京湘玉 的博客 538

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8806

创造型设计模式

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。创造性设计模式提供了多种灵活的对象创建方式,帮助我们在不同的场景下更好地管理对象的创建过程。单例模式确保全局唯一实例,原型模式通过复制对象来创建新对象,三大工厂模式(简单工厂、工厂方法、抽象工厂)提供了不同层次的抽象来创建对象,而建造者模式则将复杂对象的构建过程分离出来。通过合理使用这些设计模式,我们可以提高代码的可维护性和可扩展性。

weixin_45778846的博客 726

RK3568平台开发系列讲解:Linux wifi的调试

查询结果中state为ENABLE,表示hostapd程序启用成功。首先查看设备是否存在。

内核笔记 169

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

23种设计模式--1创造型模式

1 创建型模式 1.1 Factory模式 问题: 在面向对象系统设计中经常可以遇到以下的两类问题:

LiLan_的专栏 569

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

设计模式—建造者模式及实例(BuilderPattern)

建造者模式(Builder Pattern)也称生成器模式,它属于创建型模式。

小嵩的博客 4003

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

建造者模式BuilderPattern

建造者模式BuilderPattern建造者模式简介应用场景:优点:缺点:典型例子:装配电脑。建造者模式结构:四大类产品类抽象建造者类具体建造者类指挥部类 建造者模式简介 一件产品/一个事物,由多个部件组成,这些部件可以自由替换,每个部件都有自己的创建过程,那么需要这个产品的客户端(使用者)可以忽略每个部件的创建过程,或者说使用者不关心你产品每个部件是如何产生的,你只要给我完整的产品就行,至于你各部件怎么建的、建好后又是如何装配成完整产品的,那是你的事,别特么让我知道,我嫌烦。 应用场景: (1) 需要生成

diezhongbing1358的博客 293

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

建造者模式(BuilderPattern)

原文参考出处:https://blog.youkuaiyun.com/u010102390/article/details/80179754 介绍: 建造者模式:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可...

静风落叶的博客 221

设计模式之建造者模式(BuilderPattern)

一.意义 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 说明:复杂对象的构建,比如一个对象有几十个成员属性,那么我们在创建这个对象,并给成员属性赋值时,就会很麻烦。采用建造者模式,就是把创建对象并给成员属性赋值的工作,分离出来,由建造者角色来完成,业务程序员直接调用导演类,获得复杂对象即可,无需再进行对象的创建工作了。 二.角色 建造者模式涉及到一下几种角色: Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方

敲代码的小小酥的博客 415

设计模式——建造者模式(BuilderPattern)

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 UML图:

雪夜&流星的专栏 571

设计模式之建造者模式BuilderPattern(七)

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。@Data:这是Lombok中提供的Getter和Setter方法和toString方法的注解。@AllArgsConstructor:这是Lombok中提供的包含所有参数的构造方法注解。@NoArgsConstructor:这是Lombok中提供的不包含任何参数的构造方法注解。3、OrderBuilder类。1、OrderItem类。

徐泗空的博客 1334

设计模式建造者模式(BuilderPattern)

核心模块:Builder抽象建造者、ConcreteBuilder具体建造者、Product产品角色、Director指挥者 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:构建复杂对象,或者构件过程中需要强制的分布措施; 优点:客户可以精细的控制构建过程,将产品创建过程和产品本省分离,细节依赖于

didiao11300的专栏 294

您的设计模式——建造者模式【Builder Pattern】

又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司很满意我们做的模型, 又签订了一个合同,把奔驰、宝马的车辆模型都交给我我们公司制作了,不过这次又额外增加了一个新需 求:汽车的启动、停止、喇叭声音、引擎声音都有客户自己控制,他想什么顺序就什么顺序,这个没问题 吧?”。 看着老大殷切的目光,我还能说啥,肯定的点头, “没问题! ” ,加班加点做呗, “再苦再累就当自己二 百

454

设计模式——建造者模式

又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。2)、构造者模式,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。3)、构造者模式主要解决在软件系统中,当面临一个复杂对象的创建工作时,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法却相对稳定。

程序猿进阶 1775

生成器模式/建造者模式(BuilderPattern)

生成器模式/建造者模式(BuilderPattern):通过多个简单对象累积逐步构建成目标复杂的对象。这种设计模式属于创建型模式,提供创建对象的某种方式。 生成器模式/建造者模式的使用:在软件系统中有时候面临”某个极端复杂的对象"的创建需求,其通常由各个部分的子对象(部件对象)采用一定的算法构成;由于极端复杂需求的变化,这个极端复杂对象的各个部分经常面临着剧烈的变化,但是将各个部件组合在一起的逻辑算法却相对稳定。 基本的部件对象本身不会变但部件的组合经常变化时。 生成器(建造者)模式优点:建造者独立,易扩展

yanhaijunyan的博客 281

设计模式实现(四)建造者模式

1.什么是建造者模式(Builder Pattern) 建造者模式(Builder Pattern)又叫生成器模式,是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象,从而达到代码复用性。 建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。 2.建造者模式的优点 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 用户只需要给出指定复杂对象的类型和内容; 建造

WormholeStack 1281

JAVA设计模式之建造者模式详解

建造者模式(builder pattern), 也被称为生成器模式, 是一种创建型设计模式.定义: 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。**建造者模式要解决的问题 **建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。

励志成为一名优秀的全能型软件开发工程师。 4282
上一篇: Java内存区域与内存溢出异常
下一篇: Spring架构和环境搭建
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值