Java设计模式-创建者模式-建造者模式

建造者模式

建造者模式

建造者模式是将一个复杂对象的构件与表示分离,使得同样的构件过程可以创建不同的表示。

建造者模式将内部构件的创建和组装分割开,一般使用链式编程,代码整洁优雅

案例

建造者模式比较简单,这里就直接上代码了

以 RabbitMQClient 为例实现建造者模式

java 复制代码
public class RabbitMQClient {
    
    // 私有构造,目标类的构造方法要传入一个Builder对象
    private RabbitMQClient(Builder builder){
        
    }
    
    // builder类位于目标类的内部,并且使用static修饰
    public static class Builder{
        // 保证不可变对象的密闭性
        private String host = "127.0.0.1";

        private int port = 5672;

        private int mode;

        private String exchange;

        private String queue;

        private boolean isDurable = true;

        int connectTime = 1000;
        
        public String getHost() {
            return host;
        }

        public Builder setHost(String host) {
            this.host = host;
            return this;
        }

        public int getPort() {
            return port;
        }

        public Builder setPort(int port) {
            this.port = port;
            return this;
        }

        public int getMode() {
            return mode;
        }

        public Builder setMode(int mode) {
            this.mode = mode;
            return this;
        }

        public String getExchange() {
            return exchange;
        }

        public Builder setExchange(String exchange) {
            this.exchange = exchange;
            return this;
        }

        public String getQueue() {
            return queue;
        }

        public Builder setQueue(String queue) {
            this.queue = queue;
            return this;
        }

        public boolean isDurable() {
            return isDurable;
        }

        public Builder setDurable(boolean durable) {
            isDurable = durable;
            return this;
        }

        public int getConnectTime() {
            return connectTime;
        }

        public Builder setConnectTime(int connectTime) {
            this.connectTime = connectTime;
            return this;
        }

        //    builder提供 build()方法,实现目标对象的创建
        public RabbitMQClient build(){
            if (mode == 1) {// 工作队列模式不需设计交换机,但是队列名称一定要有
                if (exchange != null) {
                    throw new RuntimeException("工作队列模式不需设计交换机");
                }
                if (queue == null || queue.trim().equals("")) {
                    throw new RuntimeException("工作队列不能为空");
                }
                if (isDurable == false) {
                    throw new RuntimeException("工作队列模式必须开启持久化");
                }
            } else if (mode == 2) {// 路由模式必须设计交换机,但是不能设计队列
                if (exchange == null) {
                    throw new RuntimeException("路由模式必须设计交换机");
                }
                if (queue != null) {
                    throw new RuntimeException("路由模式无需设计队列名称");
                }
            }
            return new RabbitMQClient(this);
        }
    }

    public void sendMsg(String msg){
        System.out.println("发送消息:"  + msg);
    }

}

测试代码如下:

java 复制代码
@Test
public void builderTest(){
        RabbitMQClient client = new RabbitMQClient.Builder()
                .setHost("192.168.11.111")
                .setMode(1)
                .setPort(5672)
                .setQueue("queue-test")
                .build();

        client.sendMsg("this is test");
}

与工厂模式的区别:

工厂模式注重整体对象的创建,建造者模式注重构件的创建,然后再将构件组装成一个完整的对象。

一般情况下,建造者模式创建的对象更复杂

工厂模式是生产工厂,建造者模式是组装工厂

这里引申一下建造者模式简单构件方法------使用lombok 包下面的 @Builder 注解

@Builder 注解

使用@Builder 注解 可以方便快捷使用 建造者模式

下面使使用案例

java 复制代码
@Builder
public class RabbitMQClient2 {
    
    private String host = "127.0.0.1";

    private int port = 5672;

    private int mode;

    private String exchange;

    private String queue;

    private boolean isDurable = true;

    int connectTime = 1000;

    public void sendMsg(String msg){
        System.out.println("发送消息:"  + msg);
    }

}

测试代码:

java 复制代码
/**
     * lombok @Builder 注解使用
     */
@Test
public void builder2Test(){
    RabbitMQClient2 client = RabbitMQClient2.builder()
            .host("192.168.11.111")
            .mode(1)
            .port(5672)
            .queue("queue-test")
            .build();

    client.sendMsg("this is test");
}
相关推荐
鬼手点金8 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck9 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网10 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff11 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
Shaoshing11 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
dd聊技术11 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly768911 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY11 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty