基本概念
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,又叫做生成器模式。建造者模式将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。
结构图
上图摘自《大话设计模式》
应用场景
如果一个对象的创建有固定的组成和流程,如组装电脑,包括主机、显示器、键盘、鼠标等几个主要部分(示例代码就是以此为例的),当需要将复杂对象的创建与它的表示分离时可以使用建造者模式。使用了建造着模式,只需要传入指定的建造类型就可以得到对应的产品,而具体的建造过程和细节则不需要知道。
源码示例(以组装电脑为例)
1.创建产品类,即Computer
package com.spook.builder; /** * 产品类,以计算机为例,建造者模式最终就是要创建出产品 */ public class Computer { /** 主机 */ private String host; /** 显示器 */ private String monitor; /** 鼠标 */ private String mouse; /** 键盘 */ private String keyboard; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getMonitor() { return monitor; } public void setMonitor(String monitor) { this.monitor = monitor; } public String getMouse() { return mouse; } public void setMouse(String mouse) { this.mouse = mouse; } public String getKeyboard() { return keyboard; } public void setKeyboard(String keyboard) { this.keyboard = keyboard; } public void show() { System.out.println("主机:" + getHost() + ",显示器:" + getMonitor() + ",鼠标:" + getMouse() + ",键盘:" + getKeyboard()); } }2.创建builder接口
package com.spook.builder; /** * 电脑建造者接口,假定电脑由以下四部分组成 */ public interface ComputerBuilder { /** 添加主机 */ public void addHost(); /** 添加显示器 */ public void addMonitor(); /** 添加鼠标 */ public void addMouse(); /** 添加键盘 */ public void addKeyBoard(); /** 组装,返回一个电脑对象 */ public Computer build(); }3.创建builder接口的一个实现类,LenovoBuilder
package com.spook.builder; public class LenovoBuilder implements ComputerBuilder { private Computer lenoveComputer = new Computer(); @Override public void addHost() { // TODO Auto-generated method stub lenoveComputer.setHost("联想主机"); } @Override public void addMonitor() { // TODO Auto-generated method stub lenoveComputer.setMonitor("联想显示器"); } @Override public void addMouse() { // TODO Auto-generated method stub lenoveComputer.setMouse("联想鼠标"); } @Override public void addKeyBoard() { // TODO Auto-generated method stub lenoveComputer.setKeyboard("联想键盘"); } @Override public Computer build() { // TODO Auto-generated method stub return lenoveComputer; } }4.创建builder接口的另一个实现类,DellBuilder
package com.spook.builder; public class DellBuilder implements ComputerBuilder { private Computer dellComputer = new Computer(); @Override public void addHost() { // TODO Auto-generated method stub dellComputer.setHost("戴尔主机"); } @Override public void addMonitor() { // TODO Auto-generated method stub dellComputer.setMonitor("戴尔显示器"); } @Override public void addMouse() { // TODO Auto-generated method stub dellComputer.setMouse("戴尔鼠标"); } @Override public void addKeyBoard() { // TODO Auto-generated method stub dellComputer.setKeyboard("戴尔键盘"); } @Override public Computer build() { // TODO Auto-generated method stub return dellComputer; } }5.创建一个工人类,通过不同的Builder生产不同的电脑
package com.spook.builder; /** * 组装电脑的工人,可选用不同的建造者建造不同型号的电脑 */ public class Worker { /*** * 通过特定的建造者来组装电脑 * * @param builder */ public void assembleByBuilder(ComputerBuilder builder) { builder.addHost(); builder.addMonitor(); builder.addMouse(); builder.addKeyBoard(); } }6.测试类
package com.spook.builder; /*** * 测试类 */ public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Worker worker = new Worker(); /** * 联想电脑建造者 */ ComputerBuilder lenovoBuilder = new LenovoBuilder(); worker.assembleByBuilder(lenovoBuilder); Computer lenovoComputer = lenovoBuilder.build(); lenovoComputer.show(); /** * 戴尔电脑建造者 */ ComputerBuilder dellBuilder = new DellBuilder(); worker.assembleByBuilder(dellBuilder); Computer dellComputer = dellBuilder.build(); dellComputer.show(); } }运行测试类会输出如下内容:
主机:联想主机,显示器:联想显示器,鼠标:联想鼠标,键盘:联想键盘 主机:戴尔主机,显示器:戴尔显示器,鼠标:戴尔鼠标,键盘:戴尔键盘