首页 > 其他分享 >设计模式-建造者模式

设计模式-建造者模式

时间:2024-10-05 16:46:59浏览次数:10  
标签:return String 建造 模式 Override new 设计模式 public BigDecimal

什么是建造者模式?
在这里插入图片描述

建造者模式是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。

简单模拟场景:

装修公司的套餐服务,豪华、简约风格。比如对于吊顶和地板,有一级二级吊顶,一级二级地板等。按不同的套餐价格选取不同的组合。

物料接口:

public interface Matter {

    String scene(); // 场景:吊顶、地板
    
    String brand(); // 品牌
    
    String model(); // 型号
    
    BigDecimal price(); // 价格
    
    String desc(); // 描述
}

  • 物料接口提供了基本信息。

吊顶:

public class LevelOneCeiling implements Matter {
    @Override
    public String scene() {
        return "吊顶";
    }

    @Override
    public String brand() {
        return "装修公司自带";
    }

    @Override
    public String model() {
        return "一级顶";
    }

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

    @Override
    public String desc() {
        return "造型只做低一级,只有一个层次的吊顶,一般离顶120-150mm";
    }
}
public class LevelTwoCeiling implements Matter {
    @Override
    public String scene() {
        return "吊顶";
    }

    @Override
    public String brand() {
        return "装修公司自带";
    }

    @Override
    public String model() {
        return "二级顶";
    }

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

    @Override
    public String desc() {
        return "两个层次的吊顶,二级吊顶高度一般就往下吊20cm,要是层高很高,也可增加每级的厚度";
    }
}

地板:

public class DerFloor implements Matter {
    @Override
    public String scene() {
        return "地板";
    }

    @Override
    public String brand() {
        return "德尔";
    }

    @Override
    public String model() {
        return "A+";
    }

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

    @Override
    public String desc() {
        return "DER德尔集团是全球领先的专业木地板制造商,北京2008年奥运会家装和公装地板供应商";
    }
}

public class ShengXiangFloor implements Matter {
    @Override
    public String scene() {
        return "地板";
    }

    @Override
    public String brand() {
        return "圣象";
    }

    @Override
    public String model() {
        return "一级";
    }

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

    @Override
    public String desc() {
        return "圣象地板是中国地板行业著名品牌。圣象地板拥有中国驰名商标、中国名牌、国家免检、中国环境标志认证等多项荣誉。";
    }
}

建造者模式主要解决的问题是在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的过程构成;由于需求的变化,这个复杂对象的各个部分经常面临着重大的变化,但是将它们组合在一起的过程却相对稳定。

这里我们会把构建的过程交给创建者类,而创建者通过使用我们的构建工具包,去构建出不同的装修套餐

  • Builder,建造者类具体的各种组装由此类实现。
  • DecorationPackageMenu,是IMenu接口的实现类,主要承载构造过程中的填充器。相当于这是一套承载物料和创建者中间衔接的内容。

定义装修包接口:

public interface IMenu {
    
    IMenu appendCeiling(Matter matter); // 吊顶
    
    IMenu appendFloor(Matter matter); // 地板
    
    String getDetail(); // 明细
}

接口中定义了田中各项物料的方法;吊顶、地板,以及最终提供获取全部明细的方法。

装修包实现:

public class DecorationPackageMenu implements IMenu{

    private List<Matter> list = new ArrayList<>(); // 装修清单
    private BigDecimal price = BigDecimal.ZERO; // 装修价格

    private BigDecimal area; // 面积
    private String grade; // 装修等级

    private DecorationPackageMenu() {}

    public DecorationPackageMenu(BigDecimal area, String grade) {
        this.area = area;
        this.grade = grade;
    }

    @Override
    public IMenu appendCeiling(Matter matter) {
        list.add(matter);
        price = price.add(area.multiply(new BigDecimal("0.2")).multiply(matter.price()));
        return this;
    }

    @Override
    public IMenu appendFloor(Matter matter) {
        list.add(matter);
        price = price.add(area.multiply(matter.price()));
        return this;
    }

    @Override
    public String getDetail() {
        StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +
                "装修清单" + "\r\n" +
                "套餐等级:" + grade + "\r\n" +
                "套餐价格:" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +
                "房屋面积:" + area.doubleValue() + " 平米\r\n" +
                "材料清单:\r\n");

        for (Matter matter: list) {
            detail.append(matter.scene()).append(":").append(matter.brand()).append("、").append(matter.model()).append("、平米价格:").append(matter.price()).append(" 元。\n");
        }

        return detail.toString();
    }
}
  • 装修包的实现中每一个方法都返回了 this,也就可以非常方便的用于连续填充各项物料。

建造者方法:

public class Builder {

    public IMenu levelOne(BigDecimal area) {
        return new DecorationPackageMenu(area, "豪华")
                .appendCeiling(new LevelOneCeiling())
                .appendFloor(new ShengXiangFloor());
    }
    
    public IMenu levelTwo(BigDecimal area) {
        return new DecorationPackageMenu(area, "简约")
                .appendCeiling(new LevelTwoCeiling())
                .appendFloor(new DerFloor());
    }
}

建造者的使用就非常容易,通过不同的物料填充不同的装修风格。

测试:

public class AppTest {
    @Test
    public void test() {
        Builder builder = new Builder();
        // 豪华
        IMenu levelOne = builder.levelOne(new BigDecimal(500));
        System.out.println(levelOne.getDetail());
        // 简约
        IMenu levelTwo = builder.levelTwo(new BigDecimal(100));
        System.out.println(levelTwo.getDetail());
    }
}

这样方便进行业务扩展。

总结:

  • 什么时候选择建造者模式?当一些基本物料不会变,而其组合经常变化的时候
  • 此设计模式满足了单一职责原则以及可复用的技术、建造者独立、易扩展、便于控制细节风险。但同时当出现特别多的物料以及很多的组合后,类的不断扩展也会造成难以维护的问题。但这种设计结构模型可以把重复的内容抽象到数据库中,按照需要配置。这样就可以减少代码中大量的重复。

参考来源–https://bugstack.cn/

标签:return,String,建造,模式,Override,new,设计模式,public,BigDecimal
From: https://blog.csdn.net/qq_43754148/article/details/142716245

相关文章

  • 模板设计模式
    模板设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。结构抽象类(AbstractClass)定义了模板方法(TemplateMethod),它包含了算法的骨架,通常是一个final方法,以防止子类重写整个算法流程。同时定义了一些抽象方法(AbstractMethod),这......
  • 打开开发者模式
    进入设置:从这里进去:在这里连续点7,8下:然后从system进去:在Advanced这里:就有了开发者选项:模拟器安装时,开发者选项默认是开启的,可以手动关闭,需要的时候再像这里演示的那样去开启.进入这个开发者选项:这里的USBdebugging要打开.......
  • 用建造者模式的思想改造构造方法。灵活,快捷的链式创建对象
    当一个类的构造器需要传入很多参数的时候,他的可读性会变得很差,这个时候用建造者模式的思想进行重构会让代码更加灵活,可读性也更好。下面演示一下具体步骤:要创建对象的类是phone类。里面有两个属性numberpeople。首先私有化构造方法,传入参数是Builderbuilder,这个是下面我们......
  • Redis 发布订阅模式
    概述Redis的发布/订阅是一种消息通信模式:发送者(Pub)向频道(Channel)发送消息,订阅者(Sub)接收频道上的消息。Redis客户端可以订阅任意数量的频道,发送者也可以向任意频道发送数据。在发送者向频道发送一条消息后,这条消息就会被发送到订阅该频道的客户端(Sub)Redis有两种发布/订阅模式......
  • (六)WPF数据驱动模式
     WPF开发方式; MVVM(ModelViewViewModel)1.绑定XAML数据方式  在 XAML中添加绑定数据和绑定的操作属性        Content="{BindingMyVar}" 在XAML对应了的窗体类的构造函数添加数据绑定        this.DataContext=mainViewModel;//让此页面的数据取......
  • 35_初识搜索引擎_multi-index&multi-type搜索模式解析以及搜索原理初步图解
    课程大纲1、multi-index和multi-type搜索模式告诉你如何一次性搜索多个index和多个type下的数据/_search:所有索引,所有type下的所有数据都搜索出来/index1/_search:指定一个index,搜索其下所有type的数据/index1,index2/_search:同时搜索两个index下的数据/1,2/_search:按照通配......
  • 操作系统:保护模式(一)GDT 与分段机制
    GDT与分段机制CPU开机时运行于实模式,寻址方式是段寄存器\(\times\)10+偏移寄存器=物理地址,主要原因是因为8086地址线和数据线不匹配导致的。但是这种寻址方式既不安全也不支持现代操作系统所需的、多任务支持、cpu特权模式等。在实模式下,对于基址,变址寻址的寄存器有明确要......
  • afl-fuzz的qemu模式中如何去判断是否crash
    1.afl-fuzz部分afl-fuzz部分和非qemu模式是相同的,主要是通过管道接收来自forkserver传入的status信息,通过status信息来判断是否存在crashif(unlikely(/*Anormalcrash/abort*/(WIFSIGNALED(fsrv->child_status))||/*specialhandling......
  • 操作系统:保护模式(二)内存模型
    平坦内存模型现代操作系统一般不会使用过于复杂的分段机制,而是采用平坦内存模型+分页模型来管理内存。平坦内存模型(FlatMemoryModel),这是现代操作系统(如Linux和Windows)常用的内存模型。在这种模型中,所有段的段基址都为0,段界限为4GB,使得整个内存空间看起来像一个连续的内......
  • 操作系统:保护模式(五)特权
    特权机制特权特权级数值越大,级别越小。通常,因为操作系统是为所有程序服务的,可靠性最高,而且必须对软硬件有完全的控制权,所以它的主体部分必须拥有特权级0,并处于整个环形结构的中心。也正是因为这样,操作系统的主体部分通常又被称做内核(Kernel、Core)。特权级1和2通常赋予那......