将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,“建造者(Builder)模式”,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程 分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。--《大话设计模式》
还是以组装电脑为例子开展代码:
1 /** 2 * 产品 3 */ 4 public class Computer { 5 private String cpu; 6 private String mainboard; 7 8 public String getCpu() { 9 return cpu; 10 } 11 12 public void setCpu(String cpu) { 13 this.cpu = cpu; 14 } 15 16 public String getMainboard() { 17 return mainboard; 18 } 19 20 public void setMainboard(String mainboard) { 21 this.mainboard = mainboard; 22 } 23 }
1 /** 2 * 是为创建一个Computer对象的各个部件指定的抽象接口 3 */ 4 public interface IBuilderComputer { 5 //创建cpu 6 void buildCpu(); 7 //创建主板 8 void buildMainbord(); 9 10 //交付电脑 11 Computer deliverComputer(); 12 }
1 /** 2 * 具体的建造者,实现接口,构造和装配各个部件 3 */ 4 public class ConcreteBuilderComputer implements IBuilderComputer { 5 private Computer computer=new Computer(); 6 @Override 7 public void buildCpu() { 8 computer.setCpu("CPU创建成功"); 9 } 10 11 @Override 12 public void buildMainbord() { 13 computer.setMainboard("主板创建成功"); 14 } 15 16 /** 17 * 向用户交付电脑 18 * @return 19 */ 20 @Override 21 public Computer deliverComputer() { 22 return computer; 23 } 24 }
1 ** 2 * 负责人(指挥人)是构建一个使用Builder接口的对象 3 * 根据用户的需求组装电脑 4 */ 5 public class Director { 6 private IBuilderComputer builder; 7 8 public Director(IBuilderComputer builderComputer){ 9 this.builder=builderComputer; 10 } 11 12 /** 13 * 将CPU和主板装在一起 14 */ 15 public void construct(){ 16 builder.buildCpu(); 17 builder.buildMainbord(); 18 } 19 }
1 public class Client { 2 public static void main(String[] args) { 3 IBuilderComputer builderComputer=new ConcreteBuilderComputer(); 4 Director director=new Director(builderComputer); 5 director.construct(); 6 Computer computer=builderComputer.deliverComputer(); 7 System.out.println("运行"+computer.getCpu()); 8 System.out.println("运行"+computer.getMainboard()); 9 } 10 }
在什么情况下使用建造模式
1. 需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成部分。
2. 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想。
3. 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。