3.4 建造者模式
建造者模式是什么?
建造者模式是将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
这里不禁会有疑问,将复杂对象的构建与其表示相分离,我们前面不是使用工厂方法模式可以实现了吗?可见,构造者模式不是为解决这个问题而生的。那它到底要解决什么问题呢?它是通过相同的构建过程创建不同的表示。也就是说,对象是创建出来的,但是返回的对象的属性是不同的。
UML类图:
类图代码:
Product
public interface Product { public void addPart(String part) ; public void showProduct(); }
ConcreteProductA
public class ConcreteProductA implements Product{ private List<String> parts = new ArrayList<String>(); public void addPart(String part){ parts.add(part); } public void showProduct(){ for(String str : parts){ System.out.println("ConcreteProductA:" + str); } } }
ConcreateProductB
public class ConcreateProductB implements Product { public void operation1() { System.out.println("ConcreateProductB -> operation1"); } public void operation2() { System.out.println("ConcreateProductB -> operation2"); } }
AbstractBuilder
public interface AbstractBuilder { public void addPartA(); public void addPartB(); public Product build(); }
ConcreteBuilderA
public class ConcreteBuilderA implements AbstractBuilder { private Product product = new ConcreteProductA(); public void addPartA() { product.addPart("具体类 A 的组件 A"); } public void addPartB() { product.addPart("具体类 A 的组件 B"); } public Product build() { return product; } }
ConcreteBuilderB
public class ConcreteBuilderB implements AbstractBuilder { private Product product = new ConcreteProductB(); public void addPartA() { product.addPart("具体类B 的组件 A"); } public void addPartB() { product.addPart("具体类B 的组件 B"); } public Product build() { return product; } }
Client
public class Client { public static void main(String[] args) { //定义一个组装产品 AbstractBuilder buiderA = new ConcreteBuilderA(); buiderA.addPartA(); buiderA.addPartB(); Product productA = buiderA.build(); productA.showProduct(); AbstractBuilder buiderB = new ConcreteBuilderB(); buiderB.addPartA(); buiderB.addPartB(); Product productB = buiderB.build(); productB.showProduct(); } }
执行结果
ConcreteProductA:具体类 A 的组件 A
ConcreteProductA:具体类 A 的组件 B
ConcreteProductB:具体类B 的组件 A
ConcreteProductB:具体类B 的组件 B
建造者模式应用于哪些场景?
(1)对象的构造复杂且具有不确定性,最终都获取到了相同类型的对象,但是各个对象的属性不一样。