GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。这句话说得很抽象,不好理解,其实它的意思可以理解为:将构 造复杂对象的过程和组成对象的部件解耦。
就像组装的电脑一样,不管什么品牌的配件,只要兼 容就可以装上;同样,一样的配件,可以有好多组装的方式。这是对降低耦合、提高可复用 性精神的一种贯彻。
当要生成的产品有复杂的内部结构—— 比如由多个对象组成 ;而系统中对此产品的需求 将来可能要改变产品对象的内部结构的构成,比如说产品的一些属性现在由一个小对象组 成,而更改后的型号可能需要 N 个小对象组成;而且不能将产品的内部构造完全暴露给客 户程序,一是为了可用性,二是为了安全等因素。满足上面的设计环境就可以考虑使用建造 模式来搭建框架了。
首先客户程序创建一个指导者对象,一个建造者角色,并将建造者角色传入指导者对象 进行配置。然后,指导者按照步骤调用建造者的方法创建产品。最后客户程序从建造者或者 指导者那里得到产品。 从建造模式的工作流程来看,建造模式将产品的组装“外部化”到了建造者角色中来。
这里以一个简单的iphone6的生产为例
iphone实体类
public class Iphone6 { private Cell cell; //电池 private Screen screen; //屏幕 private Mainboard mainboard; //主板 public void open() { System.out.println("手机开机"); } public Cell getCell() { return cell; } public void setCell(Cell cell) { this.cell = cell; } public Screen getScreen() { return screen; } public void setScreen(Screen screen) { this.screen = screen; } public Mainboard getMainboard() { return mainboard; } public void setMainboard(Mainboard mainboard) { this.mainboard = mainboard; } } //电池类 class Cell{ private String name; public Cell(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } //电池类 class Screen{ private String name; public Screen(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } //主板类 class Mainboard{ private String name; public Mainboard(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
指导者接口
//指导者 public interface Iphone6Director { Iphone6 dircectIphone6(); }
构造者接口
//构造者抽象类 public interface Iphone6Builder { //构建自组建 Cell builderCell(); Screen builderScreen(); Mainboard builderMainboard(); }
构造者实现类--用来创建复杂对象各个组件
public class MyIphone6Builder implements Iphone6Builder{ @Override public Cell builderCell() { // TODO Auto-generated method stub System.out.println("构建屏幕"); //也可以与工厂模式或单例模式相结合 return new Cell("iphone6的屏幕"); } @Override public Screen builderScreen() { // TODO Auto-generated method stub System.out.println("构建电池"); return new Screen("iphone6的电池"); } @Override public Mainboard builderMainboard() { // TODO Auto-generated method stub System.out.println("构建主板"); return new Mainboard("iphone6的主板"); } }
指导者实现类--负责安排各个组件的建造顺序
public class MyIphone6Director implements Iphone6Director{ private MyIphone6Builder builder; public MyIphone6Director(MyIphone6Builder builder) { this.builder = builder; } @Override public Iphone6 dircectIphone6() { // TODO Auto-generated method stub Cell cell = builder.builderCell(); Mainboard mainboard = builder.builderMainboard(); Screen screen = builder.builderScreen(); //装配成iphone6 Iphone6 iphone6 = new Iphone6(); iphone6.setCell(cell); iphone6.setMainboard(mainboard); iphone6.setScreen(screen); return iphone6; } }
测试类
public class TestIphone { public static void main(String[] args) { MyIphone6Director director = new MyIphone6Director(new MyIphone6Builder()); Iphone6 iphone6 = director.dircectIphone6(); iphone6.open(); } }
最终一台iphone手机就被组将建造出来了:
构建屏幕
构建主板
构建电池
手机开机
建造模式中很可能要用到组成成品的各种组件类,对于这些类的创建可以考虑使用工厂 方法或者原型模式来实现,在必要的时候也可以加上单例模式来控制类实例的产生。但是要 坚持一个大前提就是要使引入的模式给你的系统带来好处,而不是臃肿的结构。
建造模式在得到复杂产品的时候可能要引用多个不同的组件,在这一点上来看,建造模 式和抽象工厂模式是相似的。可以从以下两点来区分两者:创建模式着重于逐步将组件装配 成一个成品并向外提供成品,而抽象工厂模式着重于得到产品族中相关的多个产品对象;抽 象工厂模式的应用是受限于产品族的,建造模式则不会。
还可参考:
Java设计模式之构造者模式,你真正了解过吗