建造者模式介绍与使用

建造者模式介绍与使用


一、建造者模式是什么?

建造者模式的核心概念:通过多个简单对象一步步的构建出一个复杂的对象,将复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
平时开发的过程中,我们经常遇到复杂对象的创建情况。比如《王者荣耀》游戏中的不同英雄角色:眼睛,发型,技能等等;《坦克世界》里面不同的坦克:防护能力,火力,装甲,涂装等等;

对于建造者模式的概念,我们说说它的重点组成部分:
1.复杂对象:即你最终要创建的对象,它可能有很多简单对象组装而成;
2. 多个简单的对象 :可以用来组成复杂对象的小模块(复杂对象的某块组成部分);
3. 抽象建造者或具体建造者:能将多个简单对象组装成一种复杂对象的那么一个对象,如果是多种复杂产品对象,则建造者也能是一个抽象类或接口,有不同的实现类。

二、代码示例

1.代码示例

package com.demo.spring.test;

import lombok.Data;
import org.apache.commons.lang.StringUtils;

/** 
 * @Description: 建造者模式 
 * @Author: yangshilei
 */
@Data
public class ResourcePoolConfig {

    private String id;
    private String port;
    private int maxTotal;
    private String name;
    // ...假设参数很多,且不同参数有不同的业务规则

    private ResourcePoolConfig(ResourceBuilder resourceBuilder){
        this.id = resourceBuilder.id;
        this.port = resourceBuilder.port;
        this.maxTotal = resourceBuilder.maxTotal;
        this.name = resourceBuilder.name;
    }


    public static class ResourceBuilder {
        private static final String DEFAULT_ID = "127.0.0.1";
        private static final String DEFAULT_PORT = "8080";
        private static final int DEFAULT_MAX_TOTAL = 50;
        private static final String DEFAULT_NAME = "abc";

        private String id = DEFAULT_ID;
        private String port = DEFAULT_PORT;
        private int maxTotal = DEFAULT_MAX_TOTAL;
        private String name = DEFAULT_NAME;

        public ResourcePoolConfig build(){
            // 对需要创建对象的属性规则进行业务校验,模拟复杂对象的创建逻辑。
            if(StringUtils.isEmpty(id)||StringUtils.isEmpty(port)){
                throw new RuntimeException("业务校验失败!");
            }
            // 此处可能还有很多的复杂业务校验等等......

            return new ResourcePoolConfig(this);
        }

        public ResourceBuilder setId(String id){
            this.id = id;
            return this;
        }
        public ResourceBuilder setPort(String port){
            this.port = port;
            return this;
        }
        public ResourceBuilder setMaxTotal(int maxTotal){
            this.maxTotal = maxTotal;
            return this;
        }
        public ResourceBuilder setName(String name){
            this.name = name;
            return this;
        }
    }
}

2.分析代码

对于以上的代码,它们各自对应建造者模式中的哪些部分?
1.复杂对象(ResourcePoolConfig):某个复杂的资源池配置对象
2. 多个简单的对象(id、port等属性) :它们都是ResourcePoolConfig的组成属性,代码的样例比较简单,实际复杂对象属性组成也可能是某些对象;
3. 抽象建造者或具体建造者(ResourceBuilder):ResourceBuilder属于具体建造者,里面包含为ResourcePoolConfig设置各种简单属性的以及一些业务校验的方法。
它就好比工地的工人,能将一砖一瓦建成一栋高楼大厦;由于只建造一种复杂对象,此处省略了抽象建造者,直接放建造者实现类。

3.调用展示

    public static void main(String[] args)  {

        ResourcePoolConfig.ResourceBuilder resourceBuilder = new ResourcePoolConfig.ResourceBuilder();

        ResourcePoolConfig config = new ResourcePoolConfig.ResourceBuilder()
                .setId("112.223.52.45")
                .setPort("9090")
                .setName("test")
                .setMaxTotal(100)
                .build();
        System.out.println(JSON.toJSONString(config));

    }

执行结果:

{"id":"112.223.52.45","maxTotal":100,"name":"test","port":"9090"}

总结

学习设计模式不能死记硬背,要灵活运用,尤其是要理解使用的场景才能融合贯通,招式都是死的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值