建造者模式介绍与使用
一、建造者模式是什么?
建造者模式的核心概念:通过多个简单对象一步步的构建出一个复杂的对象,将复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
平时开发的过程中,我们经常遇到复杂对象的创建情况。比如《王者荣耀》游戏中的不同英雄角色:眼睛,发型,技能等等;《坦克世界》里面不同的坦克:防护能力,火力,装甲,涂装等等;
对于建造者模式的概念,我们说说它的重点组成部分:
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"}
总结
学习设计模式不能死记硬背,要灵活运用,尤其是要理解使用的场景才能融合贯通,招式都是死的。