猿创征文|一篇打通架构设计,Java设计模式10,建造者模式

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猿创征文|一篇打通架构设计,Java设计模式10,建造者模式相关的知识,希望对你有一定的参考价值。

目录

一、建造者模式

通俗的讲,比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标,但是它们选取的品牌各异,最终的电脑价格和性能又是天差地别。
而这样的根据相同的配件,不同的组装所产生出的具体的内容,就是建造者模式的具体实现,也就是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

二、建造者模式的结构

1、抽象建造者(Builder)

它声明为创建一个产品对象的各个部件指定的抽象接口,在该接口中一般声明两类方法,一类方法是buildPatX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

2、具体建造者(ConcreteBuilder)

实现抽象建造者接口,构建和装配各个部件,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

3、指挥者(Director)

它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()构造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者setter方法将该对象传入指挥者类中。它主要是用于创建一个复杂对象,它主要有两个作用①隔离了客户与对象的生成过程②负责控制产品对象的生产过程。

4、产品(Product)

产品角色,一个具体的产品对象。

三、建造者模式的优缺点

1、优点

  1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  2. 每一个具体建造者都相对独立,而与其它的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。
  3. 可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

2、缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

四、违背原则方案

比如你想组装一个电脑,需要机箱、显示器、键盘、鼠标。

1、电脑接口

package com.guor.builder;

public interface Computer 

    // 电脑配件(主机、显示器、键盘、鼠标)
    String parts();

    // 品牌
    String brand();

    // 型号
    String model();

    // 价格
    Double price();

    // 描述
    String desc();

2、主机

(1)ROG主机

package com.guor.builder;

public class RogHost implements Computer

    @Override
    public String parts() 
        return "主机";
    

    @Override
    public String brand() 
        return "ROG";
    

    @Override
    public String model() 
        return "光刃G15";
    

    @Override
    public Double price() 
        return 13999.00;
    

    @Override
    public String desc() 
        return "Intel i7-12700 16G 1TB+1TSSD RTX3070 8G独显";
    

(2)拯救者主机

package com.guor.builder;

public class LegionHost implements Computer 

    @Override
    public String parts() 
        return "主机";
    

    @Override
    public String brand() 
        return "Lenovo";
    

    @Override
    public String model() 
        return "拯救者刃7000K";
    

    @Override
    public Double price() 
        return 6999.00;
    

    @Override
    public String desc() 
        return "Intel i5-12400F 16G 512G SSD RTX3060";
    

3、显示器

(1)ROG32寸显示器

package com.guor.builder;

public class Rog32Monitor implements Computer

    @Override
    public String parts() 
        return "显示器";
    

    @Override
    public String brand() 
        return "ROG";
    

    @Override
    public String model() 
        return "华硕PG32UG";
    

    @Override
    public Double price() 
        return 7499.00;
    

    @Override
    public String desc() 
        return "32寸 游戏显示器4K 144Hz HDR600";
    

(2)ROG27寸显示器

package com.guor.builder;

public class Rog27Monitor implements Computer 

    @Override
    public String parts() 
        return "显示器";
    

    @Override
    public String brand() 
        return "ROG";
    

    @Override
    public String model() 
        return "华硕XG276Q";
    

    @Override
    public Double price() 
        return 1899.00;
    

    @Override
    public String desc() 
        return "27寸 电竞显示器 170Hz HDR400";
    

(3)三星显示器

package com.guor.builder;

public class SamsungMonitor implements Computer 

    @Override
    public String parts() 
        return "显示器";
    

    @Override
    public String brand() 
        return "三星";
    

    @Override
    public String model() 
        return "三星S27R350FHC";
    

    @Override
    public Double price() 
        return 999.00;
    

    @Override
    public String desc() 
        return "27寸 IPS 便携显示器 75HZ";
    

4、键盘

(1)ROG机械键盘

package com.guor.builder;

public class RogKeyboard implements Computer 
    @Override
    public String parts() 
        return "键盘";
    

    @Override
    public String brand() 
        return "ROG";
    

    @Override
    public String model() 
        return "龙骑士2";
    

    @Override
    public Double price() 
        return 1899.00;
    

    @Override
    public String desc() 
        return "机械键盘 双模 可分离式 104键 RGB背光 RX光轴";
    

(2)罗技机械键盘

package com.guor.builder;

public class LogitechKeyboard implements Computer 
    @Override
    public String parts() 
        return "键盘";
    

    @Override
    public String brand() 
        return "Logitech";
    

    @Override
    public String model() 
        return "G610";
    

    @Override
    public Double price() 
        return 479.00;
    

    @Override
    public String desc() 
        return "cherry机械键盘 有线 104键 电竞游戏背光";
    

5、鼠标

(1)ROG鼠标

package com.guor.builder;

public class RogMouse implements Computer 

    @Override
    public String parts() 
        return "鼠标";
    

    @Override
    public String brand() 
        return "ROG";
    

    @Override
    public String model() 
        return "战刃3";
    

    @Override
    public Double price() 
        return 599.00;
    

    @Override
    public String desc() 
        return "无限版 三模鼠标 RGB灯效可换微动26000DPI";
    

(2)罗技鼠标

package com.guor.builder;

public class LogitechMouse implements Computer 

    @Override
    public String parts() 
        return "鼠标";
    

    @Override
    public String brand() 
        return "Logitech";
    

    @Override
    public String model() 
        return "G402";
    

    @Override
    public Double price() 
        return 199.00;
    

    @Override
    public String desc() 
        return "有线鼠标 高速追踪FPS";
    

6、组装电脑

package com.guor.builder;

import java.util.ArrayList;
import java.util.List;

public class PackageComputer 


    public static String getComputerList(String name, Integer grade) 

        // 配件清单
        List<Computer> list = new ArrayList<Computer>();

        // 组装价格
        Double price = 0.00;

        // ROG套装
        if(grade == 1)
            RogHost host = new RogHost();
            Rog32Monitor monitor = new Rog32Monitor();
            RogKeyboard keyboard = new RogKeyboard();
            RogMouse mouse = new RogMouse();

            list.add(host);
            list.add(monitor);
            list.add(keyboard);
            list.add(mouse);

            price = host.price()+monitor.price()+keyboard.price()+mouse.price();
        else if(grade == 2)// ROG机箱 + 27寸显示器 + 罗技键鼠
            RogHost host = new RogHost();
            Rog27Monitor monitor = new Rog27Monitor();
            LogitechKeyboard keyboard = new LogitechKeyboard();
            LogitechMouse mouse = new LogitechMouse();

            list.add(host);
            list.add(monitor);
            list.add(keyboard);
            list.add(mouse);

            price = host.price()+monitor.price()+keyboard.price()+mouse.price();
        else if(grade == 3)// Legion机箱 + 三星显示器 + 罗技键鼠
            LegionHost host = new LegionHost();
            SamsungMonitor monitor = new SamsungMonitor();
            LogitechKeyboard keyboard = new LogitechKeyboard();
            LogitechMouse mouse = new LogitechMouse();

            list.add(host);
            list.add(monitor);
            list.add(keyboard);
            list.add(mouse);

            price = host.price()+monitor.price()+keyboard.price()+mouse.price();
        

        StringBuilder builder = new StringBuilder();
        builder.append(name+"组装电脑:\\r\\n");
        builder.append("套餐:" + grade + "\\r\\n");
        builder.append("套餐价格:" + price + " 元\\r\\n");
        builder.append("配件清单:\\r\\n");

        for (Computer computer : list) 
            builder.append(computer.parts()+"、");
            builder.append(computer.brand()+"、");
            builder.append(computer.model()+"、");
            builder.append(computer.price()+"、");
            builder.append(computer.desc()+ "\\r\\n");
        
        System.out.println("************************");
        return builder.toString();
    

    public static void main(String[] args) 
        System.out.println(getComputerList("哪吒",1));
        System.out.println(getComputerList("敖丙",2));
        System.out.println(getComputerList("妲己",3));
    


7、控制台显示

哪吒哥,不差钱!

这代码写的没毛病,根据选择的套餐等级,组装不同配置的电脑,无脑ROG就是爽!

五、建造者模式改善代码

1、电脑接口

组装一个电脑,需要主机、显示器、键盘、鼠标。

package com.guor.builder;

public interface IComputer 

    // 主机
    IComputer appendHost(Computer computer);

    // 显示器
    IComputer appendMonitor(Computer computer);

    // 键盘
    IComputer appendKeyboard(Computer computer);

    // 鼠标
    IComputer appendMouse(Computer computer);

    // 电脑清单
    String getComputerDetail();

2、组装电脑实现类

package com.guor.builder;

import java.util.ArrayList;
import java.util.List;

public class BuilderComputer implements IComputer 

    // 配件清单
    private List<Computer> list = new ArrayList<Computer>();

    // 组装价格
    private Double price = 0.00;

    // 姓名
    private String name;
    // 套餐
    private int grade;

    public BuilderComputer(String name, int grade) 
        this.name = name;
        this.grade = grade;
    

    @Override
    public IComputer appendHost(Computer computer) 
        list.add(computer);
        price += computer.price();
        return this;
    

    @Override
    public IComputer appendMonitor(Computer computer) 
        list.add(computer);
        price += computer.price();
        return this;
    

    @Override
    public IComputer appendKeyboard(Computer computer) 
        list.add(computer);
        price += compute

以上是关于猿创征文|一篇打通架构设计,Java设计模式10,建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

猿创征文|基于Java+SpringBoot+vue学生学习平台详细设计实现

云原生一篇打通架构设计,Java设计模式6,依赖倒置原则

猿创征文|TiDB 架构分析 & 读写性能测试

猿创征文|TiDB 架构分析 & 读写性能测试

一篇打通架构设计,Java设计模式9,模板方法模式

猿创征文 | 国产数据库TiDB架构特性