定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构:(书中图,侵删)
一个产品类
一个指定产品各个部件的抽象创建接口
若干个实现了各个部件的具体实现的创建类
一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用
实例:
书中使用了游戏中创建人物的例子,人都有头、四肢、躯干这些固定组成部分,但是高矮胖瘦各不相同。
我瞬间就想到了捏脸系统,虽然说捏脸系统把人物的各种细节都交给了用户设置,细节到嘴唇的弧度都可以用户调节。
但实际上创建过程还是固定不变的,用户只需要将调整好的参数发送给系统,并不需要知道系统创建时是先“安”的头,还是先“安”的脚。
出于尽量不和书中举一样的例子,充分活跃大脑,举一反三的目的,我还得再想个别的例子。(其实还是没有跳脱出去,说到底既然是建造者模式就是造东西,想了半天也都是在想能造个什么其他的东西当例子。)
那就组装个电脑吧。
台式机一般都有主机、显示器、键盘、鼠标。
电脑类(产品类):
package designpattern.builder; public class Computer { public String computerCase; public String monitor; public String keyboard; public String mouse; public String getComputerCase() { return computerCase; } public void setComputerCase(String computerCase) { this.computerCase = computerCase; } public String getMonitor() { return monitor; } public void setMonitor(String monitor) { this.monitor = monitor; } public String getKeyboard() { return keyboard; } public void setKeyboard(String keyboard) { this.keyboard = keyboard; } public String getMouse() { return mouse; } public void setMouse(String mouse) { this.mouse = mouse; } @Override public String toString() { return "Computer [computerCase=" + computerCase + ", monitor=" + monitor + ", keyboard=" + keyboard + ", mouse=" + mouse + "]"; } }
抽象建造者接口:
package designpattern.builder; public interface ComputerBuilder { void assembleComputerCase(Computer computer);// 组装主机 void assembleMonitor(Computer computer);// 组装显示器 void assembleKeyboard(Computer computer);// 组装键盘 void assembleMouse(Computer computer);// 组装显示器 }
具体建造者类:
游戏型电脑建造者类:
package designpattern.builder; public class GameComputerBuilder implements ComputerBuilder { @Override public void assembleComputerCase(Computer computer) { computer.setComputerCase("水冷机箱"); } @Override public void assembleMonitor(Computer computer) { computer.setMonitor("4k显示器"); } @Override public void assembleKeyboard(Computer computer) { computer.setKeyboard("机械键盘"); } @Override public void assembleMouse(Computer computer) { computer.setMouse("人体工学鼠标"); } }
娱乐型电脑建造者类:
package designpattern.builder; public class AmusementComputerBuilder implements ComputerBuilder { @Override public void assembleComputerCase(Computer computer) { computer.setComputerCase("普通机箱"); } @Override public void assembleMonitor(Computer computer) { computer.setMonitor("普通显示器"); } @Override public void assembleKeyboard(Computer computer) { computer.setKeyboard("普通键盘"); } @Override public void assembleMouse(Computer computer) { computer.setMouse("普通鼠标"); } }
指挥者类:
package designpattern.builder; public class ComputerBuilderDirect { public void assembleComputer(ComputerBuilder computerBuilder, Computer computer) { computerBuilder.assembleComputerCase(computer); computerBuilder.assembleMonitor(computer); computerBuilder.assembleKeyboard(computer); computerBuilder.assembleMouse(computer); } // 或者写成下面这样?可能具体情况具体分析吧 public Computer assembleComputer(ComputerBuilder computerBuilder) { Computer computer = new Computer(); computerBuilder.assembleComputerCase(computer); computerBuilder.assembleMonitor(computer); computerBuilder.assembleKeyboard(computer); computerBuilder.assembleMouse(computer); return computer; } }
客户端:
package designpattern.builder; public class Client { public static void main(String[] args) { ComputerBuilderDirect computerBuilderDirect = new ComputerBuilderDirect(); // 组装游戏型电脑 Computer gameComputer = new Computer(); computerBuilderDirect.assembleComputer(new GameComputerBuilder(), gameComputer); System.out.println("游戏型电脑:"); System.out.println(gameComputer); // 组装普通娱乐型电脑 Computer assembleComputer = new Computer(); computerBuilderDirect.assembleComputer(new AmusementComputerBuilder(), assembleComputer); System.out.println("普通娱乐型电脑:"); System.out.println(assembleComputer); } }
结果输出:
游戏型电脑: Computer [computerCase=水冷机箱, monitor=4k显示器, keyboard=机械键盘, mouse=人体工学鼠标] 普通娱乐型电脑: Computer [computerCase=普通机箱, monitor=普通显示器, keyboard=普通键盘, mouse=普通鼠标]
总结:
这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。
首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。