一、建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二、代码示例
public class Product { List<String> parts = new ArrayList<>(); public void addParts(String part){ parts.add(part); } public void show(){ parts.forEach(System.out::println); } } public interface Builder { void builderPartA(); void builderPartB(); Product getProduct(); } public class ConcreteBuilderA implements Builder { Product product = new Product(); public ConcreteBuilderA() { System.out.println("======ConcreteBuilderA====="); } @Override public void builderPartA() { product.addParts("部件A"); } @Override public void builderPartB() { product.addParts("部件B"); } @Override public Product getProduct() { return product; } } public class ConcreteBuilderB implements Builder { Product product = new Product(); public ConcreteBuilderB() { System.out.println("======ConcreteBuilderB====="); } @Override public void builderPartA() { product.addParts("部件X"); } @Override public void builderPartB() { product.addParts("部件Y"); } @Override public Product getProduct() { return product; } } public class Director { public void initBuilder(Builder builder){ builder.builderPartA(); builder.builderPartB(); } } public class Test { public static void main(String[] args) { Director director = new Director(); ConcreteBuilderA concreteBuilderA = new ConcreteBuilderA(); director.initBuilder(concreteBuilderA); concreteBuilderA.getProduct().show(); ConcreteBuilderB concreteBuilderB = new ConcreteBuilderB(); director.initBuilder(concreteBuilderB); concreteBuilderB.getProduct().show(); } /** result * ======ConcreteBuilderA===== * 部件A * 部件B * ======ConcreteBuilderB===== * 部件X * 部件Y */ }
三、优势
使得建造者代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
四、使用场景
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
原文:https://www.cnblogs.com/zsmcwp/p/12638353.html