建造者模式
将一个对象的构建和表示分离,使得同样的构建过程可以创建不同的表示
角色
-
抽象建造者builder:指定一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造
-
具体建造者:实现builder接口,构建和装配产品各个部件,定义并明确它所创建的表示,提供一个返回这个产品的接口
-
指挥者Director:构建一个使用builder接口的对象,负责管理整个产品的流程
-
产品角色Product:被构建的复杂对象,具体建造者创建该产品的内部表示并定义它的装配过程,它包含定义组成部件的类,包括这些部件装配成最终产品的接口
指挥者角色:Director
public class Director { public void Build(AbstractBuilder builder){ builder.BuilderA(); builder.BuliderB(); }}
产品角色:Product
public class Product { Listlist=new ArrayList (); //产品的部件集合 /** * 表示配件装配过程 * @param partName 产品部件名称 */ public void add(String partName){ list.add(partName); } public void show() { for(String str:list){ System.out.println(str); } }}
抽象建造者:AbstractBuilder
public abstract class AbstractBuilder { //构建部件B public abstract void BuilderA(); //构建部件A public abstract void BuliderB(); //取出产品 public abstract Product getProduct();}
具体建造者角色:
public class ConcreteBuilderA extends AbstractBuilder { private Product product = new Product(); //构建的目标对象 @Override public void BuilderA() { product.add("A建造者正在组装产品A部件....."); } @Override public void BuliderB() { product.add("A建造者正在组装产品B部件....."); } @Override public Product getProduct() { //提供返回构建的目标对象的方法 return product; }}
public class ConcreteBuilderB extends AbstractBuilder { private Product product=new Product(); @Override public void BuilderA() { product.add("B建造者正在组装产品A部件....."); } @Override public void BuliderB() { product.add("B建造者正在组装产品B部件....."); } @Override public Product getProduct() { return product; }}
测试代码:
Director director = new Director(); //指挥者:负责产品部件的整个生产流程//调用A建造者生产产品AbstractBuilder builder = new ConcreteBuilderA(); director.Build(builder); //制定负责整个产品生产的建造者Product product=builder.getProduct(); //获取建造者生产的产品product.show();System.out.println("-------------------");//调用B建造者生产产品builder = new ConcreteBuilderB();director.Build(builder);product = builder.getProduct();product.show();
通俗解释
汽车厂(指挥者)准备生产某型汽车,然后将零部件变速箱(产品)下单给汽车零部件供应商A/B(建造者),然后汽车零部件供应商A/B按照汽车厂的规范组装胜场生产变速箱,最后生产的产品交给汽车厂使用
经典使用:Java fluent风格代码(Lombok @Builder注解)