设计模式——建造者模式03

news2024/11/20 23:26:45

工厂模式注重直接生产一个对象,而建造者模式 注重一个复杂对象是如何组成的(过程),在生产每个组件时,满足单一原则,实现了业务拆分。
设计模式,一定要敲代码理解
在这里插入图片描述

组件抽象

public interface Icomponent {
     String position(); //材料分类 :地板 屋顶 门 窗
     String type(); //具体材料 如 木窗 ,水泥屋顶

     BigDecimal price(); //每平方米的价格

}

组件实现(部分展示)

  1. 平开窗
/**
 * @author ggbond
 * @date 2024年04月02日 09:37
 * 平开窗
 */
public class CasementWindow implements Icomponent {
    @Override
    public String position() {
        return "窗户";
    }

    @Override
    public String type() {
        return "平开窗";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(120);
    }

}
  1. 推拉窗
/**
 * @author ggbond
 * @date 2024年04月02日 09:37
 * 推拉窗
 */
public class SlidingWindow implements Icomponent {
    @Override
    public String position() {
        return "窗户";
    }

    @Override
    public String type() {
        return "旋转窗";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(80);
    }
}
  1. 瓦片屋顶
/**
 * @author ggbond
 * @date 2024年04月02日 09:36
 * 瓦片屋顶
 */
public class TileRoof implements Icomponent {
    @Override
    public String position() {
        return "屋顶";
    }

    @Override
    public String type() {
        return "瓦片屋顶";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(60);
    }
}

组件聚合抽象(需建造的对象)

public interface Ihouse {
    Ihouse addDoor(Icomponent door);
    Ihouse addFloor(Icomponent floor);
    Ihouse addWindow(Icomponent window);
    Ihouse addRoof(Icomponent roof);
    String getInfo();
}

组件聚合实体

public class House implements  Ihouse{

    private HashMap<String,Icomponent> map;
    private  String name;
    private  BigDecimal area;
    private BigDecimal prize=BigDecimal.ZERO;

    private House(){};
    public House(float area,  String name){
        map=new HashMap<>();
        this.area=new BigDecimal(area);
        this.name=name;
    }
    @Override
    public Ihouse addDoor(Icomponent door) {
        map.put("door",door);
        prize=prize.add(door.price());
        return this;
    }

    @Override
    public Ihouse addFloor(Icomponent floor) {
        map.put("floor", floor);
        prize=prize.add(area.multiply(floor.price()));
        return this;
    }

    @Override
    public Ihouse addWindow(Icomponent window) {
        map.put("window", window);
        prize=prize.add(area.multiply(window.price()));
        return this;
    }

    @Override
    public Ihouse addRoof(Icomponent roof) {
        map.put("roof", roof);
        prize=prize.add(area.multiply(roof.price()));
        return this;
    }
    @Override
    public String getInfo(){
        StringBuilder info=new StringBuilder(
                "房子名称:"+name+"\r\n"+
                "装修面积:"+area+"\r\n"+
                "装修材料如下:"+"\r\n"+
                map.get("door").type()+"\r\n"+
                map.get("window").type()+"\r\n"+
                map.get("roof").type()+"\r\n"+
                map.get("floor").type()+"\r\n"+
                "装修费用共计:"+prize+" 元"+"\r\n"+
                "---------------------------"+"\r\n");
        return  info.toString();
    }
}

建造者

负责封装实体对象

public class Builder {
    public Ihouse type1(float area,String name){
        return new House(area,name)
                .addDoor(new WoodDoor())
                .addFloor(new WoodFloor())
                .addWindow(new SlidingWindow())
                .addRoof(new TileRoof());
    }

    public Ihouse type2(float area,String name){
        return new House(area,name)
                .addDoor(new GlassDoor())
                .addFloor(new MarbleFloor())
                .addWindow(new CasementWindow())
                .addRoof(new CementRoof());
    }
}

测试

public class Main {
    public static void main(String[] args) {
        Builder builder=new Builder();
        System.out.println(builder.type1(60f,"ggbond_house1").getInfo());
        System.out.println(builder.type2(120f,"ggbond_house2").getInfo());
    }
}

结果展示

房子名称:ggbond_house1
装修面积:60
装修材料如下:
木制门
旋转窗
瓦片屋顶
木质地板
装修费用共计:12460---------------------------

房子名称:ggbond_house2
装修面积:120
装修材料如下:
玻璃门
平开窗
水泥屋顶
大理石地砖
装修费用共计:22930---------------------------

总结

建造模式把一个复杂的对象或者流程进行逐个设计,使得各个部分职责划分明确。并对内部进行封装,结合上述代码使用者可以不知道house消息,即可通过builder进行生产不同对象实体。

代码下载

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法设计与分析实验报告c++实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…

JDI LCD 驱动时序介绍

1. 引言 绝大多数 STM32 MCU 都可应用于图形界面&#xff0c;而且很多系列还内置图形硬件 LTDC&#xff0c;支持驱动 RGB 接口的 LCD。但是存在少数类型的 LCD&#xff0c;如 JDI 屏&#xff0c;除了 STM32L4P5 支持外&#xff0c;其它 MCU 只能根据屏的接口时序要求&#xff…

DNS和HTTP

DNS应用层协议 域名解析系统 使用IP地址&#xff0c;来描述设备在网络上的位置 IP地址并不适合来进行传播网站&#xff0c;就采用了域名的方式来解决网站传播的问题。如www.baidu.com这样类似的就很容易让人记住。其域名就直接代表了这个网站。而且有一套自动的系统会将域名解…

LeetCode 2192.有向无环图中一个节点的所有祖先:拓扑排序

【LetMeFly】2192.有向无环图中一个节点的所有祖先&#xff1a;拓扑排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/ 给你一个正整数 n &#xff0c;它表示一个 有向无环图 中节点的数目&#xff0c;节点编…

AFCI 应用笔记二之数据采集

1. 简介 基于监督学习的神经网络算法需要大量数据作为输入&#xff0c;模型完全由数据驱动&#xff0c;其数据质量是算法有效的必要条件&#xff0c;所以如何高效的采集到数据&#xff0c;以及正确的标注或分析是极其重要的&#xff0c;如果第一步有问题&#xff0c;后续的所有…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的&#xff0c;直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

eBay买家号注册下单容易死号?是什么原因导致?

随着电子商务的迅猛发展&#xff0c;跨境电商平台eBay日益成为众多消费者和商家的首选。然而&#xff0c;自去年下半年以来&#xff0c;eBay推出的新规则给买家号的注册带来了前所未有的挑战。许多新用户反映&#xff0c;在注册eBay买家号后&#xff0c;往往遭遇刚注册就被冻结…

哈希表2s总结

3.哈希表 哈希表非常常用&#xff0c;字典一般会用来保存处理过后的输入输出信息&#xff0c;集合也可以用来去重&#xff0c;这部分是重点&#xff0c;但是还是那句话&#xff0c;这种题目是不会或者说很少考原题的&#xff0c;主要还是学习知识&#xff0c;所以题目看一下答…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

基于SpringBoot+Vue光影视频平台(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

SV学习笔记(六)

覆盖率类型 写在前面 覆盖率是 衡量设计验证完备性 的一个通用词。随着测试逐步覆盖各种合理的场景&#xff0c;仿真过程会慢慢勾画出你的设计情况。覆盖率工具会 在仿真过程中收集信息 &#xff0c;然后进行后续处理并且得到覆盖率报告。通过这个报告找出覆盖之外的盲区&…

设计模式——原型模式05

原型模式核心复制&#xff0c;每次new出来的对象完全不一样&#xff0c;实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝 设计模式&#xff0c;一定要敲代码理解 浅拷贝 克隆出对象&#xff0c;其中两者的引用类型属性是同一个对象。 对象信息 /*** author ggb…

C++:逻辑运算符-非与或(19)

!非!a如果a为假&#xff0c;那么当前他就是真&#xff0c;如果a是真&#xff0c;那么他直接就是假&&与a&&ba与b都为真&#xff0c;那么就是真&#xff0c;如果两个里面有一个为假那么就是假||或a||ba或b有一个为真&#xff0c;那么就是真 非&#xff08;!&…

怎样把学浪购买的课程下载下来

如何把学浪已购买的课程下载下来?这里就教大家一个方法,利用一个工具轻轻松松把视频下载下来 这个工具我打包成压缩包了,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V1…

基于springboot+vue+Mysql的在线考试系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

redis集合Set

set是一种无序集合。它和列表的区别在于列表中的元素都是可以重复的&#xff0c;而set中的元素是不能重复的。而且set中的元素&#xff0c;并不像列表那样是具有顺序的。 SADD是添加一个元素。course是集合。 SMEMBERS SISMEMBER判断Redis在不在集合course里 SREM是用来删除Re…

Jupyter Notebook安装使用(一)

1. 简介 Jupyter Notebook 是一个非常强大的工具&#xff0c;它允许用户创建和共享包含实时代码、方程式、可视化和叙事文本的文档。这种工具特别适合数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等多种应用领域。 2. 安装Jupyter Notebook 2.1. 使用 Anaconda…

校招说明书

3400字的详细说明&#xff0c;介绍了程序员类岗位校招的整体时间节点和招聘流程。还对一些常见的问题进行讨论&#xff0c;例如内推、offer和三方、实习等。 第一章介绍基本的术语&#xff0c;第二章介绍整个校招的重要流程及时间点&#xff0c;然后第三章介绍每次招聘要经过的…

golang 和java对比的优劣势

Golang&#xff08;或称Go&#xff09;和Java都是非常流行的编程语言&#xff0c;被广泛应用于各种领域的软件开发。尽管它们都是高级编程语言&#xff0c;但它们具有许多不同的特性和适用场景。本文将重点比较Golang和Java&#xff0c;探讨它们的优势和劣势。 性能方面&#…