建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需指定需要建造的类就可以得到它们,二具体建造的过程和细节就不需知道了。
应用场景:
如果需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示意图时,可以用建造者模式。
用于创建一些复杂的对象,这些对象内部构件间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
所以说,建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
//具体产品
1 //产品类,由多个部件组成 2 public class Product { 3 private List<String> parts = new LinkedList<String>(); 4 5 //添加产品部件 6 public void add(String part){ 7 parts.add(part); 8 } 9 10 //列举所有的产品部件 11 public void show(){ 12 System.out.println("产品 创建---"); 13 //列举所有的产品部件 14 for(String part:parts){ 15 System.out.println(part); 16 } 17 } 18 }
Builder:是为创建一个Product对象的各个部件指定的抽象接口。
1 /** 2 * Builder类----抽象建造者类,确定产品由两个部件partA和partB组成,并声明一个得到产品建造后结果的方法GetResult。 3 * @author 贤元 4 * 5 */ 6 public abstract class Builder { 7 public abstract void builderPartA(); 8 public abstract void builderPartB(); 9 public abstract Product getResult(); 10 }
ConcreteBuilder1是具体建造者,实现Builder接口,构造和装配各个部件。
1 //ConcreteBuilder1类-----具体建造者类 2 public class ConcreteBuilder1 extends Builder{ 3 4 private Product product = new Product(); 5 6 //建造具体的两个部件,是部件A和部件B 7 8 @Override 9 public void builderPartA() { 10 product.add("部件A"); 11 } 12 13 @Override 14 public void builderPartB() { 15 product.add("部件B"); 16 } 17 18 @Override 19 public Product getResult() { 20 return product; 21 } 22 23 }
ConcreteBuilder2是具体建造者,实现Builder接口,构造和装配各个部件。
1 //ConcreteBuilder2类-----具体建造者类 2 public class ConcreteBuilder2 extends Builder{ 3 4 private Product product = new Product(); 5 6 //建造具体的两个部件,是部件X和部件Y 7 8 @Override 9 public void builderPartA() { 10 product.add("部件X"); 11 } 12 13 @Override 14 public void builderPartB() { 15 product.add("部件Y"); 16 } 17 18 @Override 19 public Product getResult() { 20 return product; 21 } 22 23 }
Director是指挥者,用来构建一个使用Builder接口的对象。
1 //Director类----指挥者类 2 public class Director { 3 4 //用来指挥建造过程 5 public void construct(Builder builder){ 6 builder.builderPartA(); 7 builder.builderPartB(); 8 } 9 }
客户端测试类:
1 //客户端,客户端代码,客户不需要知道具体的建造过程, 2 public class Client { 3 public static void main(String[] args) { 4 Director director = new Director(); 5 Builder b1 = new ConcreteBuilder1(); 6 Builder b2 = new ConcreteBuilder2(); 7 8 // 指挥者用ConcreteBuilder1的方法来建造产品 9 director.construct(b1); 10 Product p1 = b1.getResult(); 11 p1.show(); 12 /** 13 * 打印结果: 14 * 产品 创建--- 15 部件A 16 部件B 17 */ 18 19 // 指挥者用ConcreteBuilder2的方法来建造产品 20 director.construct(b2); 21 Product p2 = b2.getResult(); 22 p2.show(); 23 /** 24 * 打印结果: 25 * 产品 创建--- 26 部件X 27 部件Y 28 */ 29 30 } 31 }
UML图: