定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
宽泛的讲:如果你需要将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示(客户端需要一个胖小人,具体怎么画靠我们自己去实现,客户端不需要知道)。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道。
场景:主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。建造者模式的好处就是是建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以需要改变一个产品的内部表示,在一定一个具体的建造者就可以。
产品类:
//产品类,由多个部件组成 public class Product { List<String> parts = new ArrayList<>(); public void add(String part){ parts.add(part); } public void show(){ for (String part:parts) { System.out.println(part); } } }
抽象建造者类:
public abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getResult(); }
具体的建造者:
public class ConcreteBuilder1 extends 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; } }
指挥者类:
public class Director { public void Construct(Builder builder){ builder.buildPartA(); builder.buildPartB(); } }
Main:
public class Main { public static void main(String[] args) { Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); director.Construct(builder1); Product product = builder1.getResult(); product.show(); } }