设计模式速记-建造者模式
建造者模式
建造者模式的定义
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
假如一个对象是有很多部分组成的,那么每个部分都可以抽象出独立的一个方法单独建造,这时候就可以使用建造者模式。例如装修的时候需要装修客厅、阳台、卧室等,那么每个部分都可以抽出来单独进行,比如客厅需要放置沙发,卧室需要放置床,阳台需要盆栽等。
建造者模式的优缺点
优点
- 各个具体的建造者相互独立,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,便于控制细节风险。
缺点
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者模式和工厂模式的区别
- 工厂模式注重整体对象的创建 ;建造者模式注重部件构建;
- 工厂模式关注整体;建造者模式注重细节;
例如我们要生产一台电脑,那么使用工厂模式直接返回给我们一个电脑;使用建造者模式我们需要一步一步构建,先构建机箱,然后是IO设备。
示例
1. 涉及的角色
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
2. 示例描述
比如我们要生产一台电脑,电脑加入分三部分,分别是机箱、显示器、键盘,那么就可以使用建造者模式,为对比加入工厂模式代码做对比。
3. 建造者模式示例代码
-
产品角色(电脑)
/** * @Description 产品类,电脑 */ public class Computer { /** * 机箱 */ private String chassis; /** * 键盘 */ private String keyboard; /** * 显示器 */ private String monitor; public void setChassis(String chassis) { this.chassis = chassis; } public void setKeyboard(String keyboard) { this.keyboard = keyboard; } public void setMonitor(String monitor) { this.monitor = monitor; } /** * 开启电脑 */ public void open(){ if (this.chassis != null && keyboard != null && monitor != null){ System.out.println("电脑已开启"); return; } System.out.println("缺少部件,无法开启"); } }
-
抽象建造者
/** * @Description 抽象建造者,规定产品各个子部件创建的抽象方法 */ public abstract class AbstractComputerFactory { protected Computer computer = new Computer(); /** * 造机箱 */ public abstract void buildChassis(); /** * 造键盘 */ public abstract void buildKeyboard(); /** * 造显示器 */ public abstract void buildMonitor(); /** * 生产出厂 * @return 电脑产品 */ public Computer getComputer(){ return this.computer; } }
-
具体建造者(苹果电脑工厂)
/** * @Description 具体建造者,实现抽象建造者接口,类比于电脑工厂 */ public class MacBookFactory extends AbstractComputerFactory { @Override public void buildChassis() { super.computer.setChassis("机箱已装配"); } @Override public void buildKeyboard() { super.computer.setKeyboard("键盘已装配"); } @Override public void buildMonitor() { super.computer.setMonitor("显示器已装配"); } }
-
指挥者(苹果销售店铺)
/** * @Description 指挥者,类比于销售店铺 */ public class AppleStore { /** * 电脑工厂(具体建造者) */ private AbstractComputerFactory factory ; public AppleStore(AbstractComputerFactory factory){ this.factory = factory; } /** * 组装后销售电脑 * @return 组装好的电脑(产品角色) */ public Computer sell(){ factory.buildChassis(); factory.buildKeyboard(); factory.buildMonitor(); return factory.getComputer(); } }
-
测试类(消费者)
/** * @Description 客户类 */ public class Consumer { public static void main(String[] args) { AppleStore appleStore = new AppleStore( new MacBookFactory()); Computer computer = appleStore.sell(); computer.open(); } }