建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
Builder:是为创建一个product对象的各个部件指定的抽象接口;
ConcreteBuilder:他是一个具体建造者,实现Builder接口,构造和装配各个部件;
Product:具体的产品角色;
Director:指挥者,它是构建一个使用Builder接口对象;
主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造者模式的好处就是是的建造代码和表示代码分离,由于建造者隐藏了该产品的是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了;
实例UML图:
代码:
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:抽象建造者类
* @date 2018-11-19 23:19
**/
public interface Builder {
void buildPartA();
void buildPartB();
Product getResult();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:产品类
* @date 2018-11-19 23:14
**/
@Slf4j
public class Product {
List<String> parts=new ArrayList<>();
public void add(String part){
parts.add(part);
}
public void show(){
log.info("产品 创建--");
for (String part:parts) {
log.info(part);
}
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:抽象建造者类
* @date 2018-11-19 23:19
**/
public interface Builder {
void buildPartA();
void buildPartB();
Product getResult();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:具体建造者类
* @date 2018-11-19 23:21
**/
@Slf4j
public class ConcreteBuilder1 implements Builder {
private Product product=new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:
* @date 2018-11-19 23:24
**/
@Slf4j
public class ConcreteBuilder2 implements Builder {
private Product product=new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.builder
* @description:指挥者类
* @date 2018-11-19 23:26
**/
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class BuilderApplicationTests {
@Test
public void contextLoads() {
Director director=new Director();
Builder builder=new ConcreteBuilder1();
Builder builder1=new ConcreteBuilder2();
director.construct(builder);
Product product=builder.getResult();
product.show();
director.construct(builder1);
Product product1=builder1.getResult();
product1.show();
}
}
运行结果:
2018-11-19 23:30:40.784 INFO 23188 --- [ main] com.shuyu.builder.Product : 产品 创建--
2018-11-19 23:30:40.785 INFO 23188 --- [ main] com.shuyu.builder.Product : 部件A
2018-11-19 23:30:40.785 INFO 23188 --- [ main] com.shuyu.builder.Product : 部件B
2018-11-19 23:30:40.785 INFO 23188 --- [ main] com.shuyu.builder.Product : 产品 创建--
2018-11-19 23:30:40.785 INFO 23188 --- [ main] com.shuyu.builder.Product : 部件X
2018-11-19 23:30:40.785 INFO 23188 --- [ main] com.shuyu.builder.Product : 部件Y
代码github地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/builder