定义
将一个复杂对象的构造与它的表示分离,使相同的构建过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成
优缺点
-
优点
封装性好,构建和表示分离 扩展性好,各个具体的建造者相互独立,有利于系统的解耦 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响
-
缺点
产品的组成部分必须相同,这限制了其使用范围 若产品内部发生变化,则建造者也需同步修改,提高了维护成本
模式的结构
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息
与工厂模式的区别
建造者模式:注重零部件的组装过程;工厂方法模式:注重零部件的创建过程
创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成
建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样
应用场景
- 相同的方法,不同的执行顺序,产生不同的结果
- 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同
- 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用
- 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值
简单举例
-
产品角色(Product)
class Product{ private String partA; private String partB; private String partC; public void setPartA(String partA) { this.partA = partA; } public void setPartB(String partB) { this.partB = partB; } public void setPartC(String partC) { this.partC = partC; } public void show(){ } }
-
抽象建造者(Builder)
abstract class Builder{ protected Product product=new Product(); public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); //返回产品对象 public Product getResult() { return product; } }
-
具体建造者(Concrete Builder)
public class ConcreteBuilder extends Builder{ public void buildPartA() { product.setPartA("建造 PartA"); } public void buildPartB() { product.setPartB("建造 PartB"); } public void buildPartC() { product.setPartC("建造 PartC"); } }
-
指挥者(Director)
class Director{ private Builder builder; public Director(Builder builder) { this.builder = builder; } //产品构建与组装方法 public Product construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); return builder.getResult(); } }
-
客户单调用
public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); Product product = director.construct(); product.show(); }