定义:
Separate the construcation of a complex object from its representationso that the same construction process can create different representation.
将一个复杂对性的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
理解:官方解释有点抽象,通俗的说法就是当业务场景需要根据不通的顺序产生不通的效果,生成不同的类的时候我们需要使用建造者模式。
建造模式需要四个部分去实现。我们一一说明:
product产品类:通常会实现所有的方法。
package com.kaisen.mainland.Text;
/**
* @author huzhibo
* @Description: 演示产品类
* @date 2020/9/6 14:07
*/
public class Product {
public void start(){
System.out.println("开始");
}
public void doThing(){
System.out.println("一类步骤:产品的业务逻辑");
}
public void doPackage(){
System.out.println("二类步骤:产品的包装");
}
public void end() {
System.out.println("结束");
}
}
抽象建造者Builder:暴露接口的抽象类,不会有具体的实现,可以用接口来代替
package com.kaisen.mainland.Text;
/**
* @author huzhibo
* @Description: 抽象建造者
* @date 2020/9/6 14:13
*/
public abstract class Builder {
/**
* 设置产品属性(是否需要包装)
* @param b
*/
public abstract void setPackage(Boolean b);
/**
* 建造产品
* @return
*/
public abstract Product buildProduct();
}
建造者实现类ActualBuilder,针对抽象类进行实现。
package com.kaisen.mainland.Text;
/**
* @author huzhibo
* @Description: 实际的建造者
* @date 2020/9/6 14:17
*/
public class ActualBuilder extends Builder{
private Product product = new Product();
@Override
public void setPackage(Boolean b) {
product.start();
product.doThing();
if (b){ product.doPackage();}
product.end();
}
@Override
public Product buildProduct() {
return product;
}
}
导演类:对外保留的类,业务需求会根据不同的逻辑去导演类中创建不通的对象来实现。
package com.kaisen.mainland.Text;
/**
* @author huzhibo
* @Description: 导演类(对外暴露)
* @date 2020/9/6 16:03
*/
public class Director {
private Builder builder = new ActualBuilder();
public Product getNoPackage(){
//生成出一个没有包装的产品
builder.setPackage(false);
return builder.buildProduct();
}
public Product getPackage(){
builder.setPackage(true);
return builder.buildProduct();
}
}
建造者模式实例就结束了,那么问什么要使用建造者模式呢。我们在业务代码中直接使用接口或者抽象类去创建对象不好吗,是的,在本文的实例中是可以这样操作的,但是业务代码往往比我们实例中复杂的多,假如需要对顺序不同,生成不通的产品呢,业务代码就必须关注每个顺序,复用性很差,业务代码重。所以建造者模式需要结合业务场景判断有无使用的必要。
综上所示,我们总结了建造者模式的有点:封装,独里可扩展,控制风险。
思考:建造者模式和工厂模式的区别。