建造者模式是创建复杂对象时使用。
工厂模式,只是创建对象实例,但是并没有给对象实例赋值,比如创建Student实例,但是并没有给Student实例的属性(name,age,classz)等赋值,建造模式实际上就是在实例化对象同时给对象的属性赋值的过程。
例如Bike对象实例包含属性(轮胎,颜色,定位GPS), 但是OFO和摩拜都属于自行车,我们需要根据厂商的需求制造OFO和摩拜两种车型(也就是给属性赋值不同的属性)。
建造者模式的UML主要包含;
实体对象(具体产品):
具体的建造者(实现建造接口规范,持有实体对象):
建造者接口规范(定义各个部件的构建方法,定义返回的产品类型):
制造者(指挥者):
如图:
这里举例一个电脑的组装过程,电脑都具有属性(CPU,内存,磁盘),但是根据电脑具体的产品,我们可以制造ThinkPad,Mac等不同型号
首先定义具体产品:
package com.wehaicao.design; import lombok.Data; import java.io.Serializable; /** * 建造的实体对象 */ @Data public class Computer implements Serializable { private String cpu ; private String memory ; private String disk ; }
定义创建接口规范:
package com.wehaicao.design; /** * 定义对象创建规范 */ public interface IBuilder { void buildCpu(); void buildMemory(); void buildDisk(); Computer getComputer(); }
定义ThinkPad的创建过程:
package com.wehaicao.design; /** * 联想电脑创建实现 */ public class ThinkPadComputer implements IBuilder { Computer computer = null ; public ThinkPadComputer() { computer = new Computer(); } @Override public void buildCpu() { computer.setCpu("这是thinkPad 的CPU"); } @Override public void buildMemory() { computer.setMemory("这是thinkPad 的Memory"); } @Override public void buildDisk() { computer.setDisk("这是thinkPad 的Disk"); } @Override public Computer getComputer() { return computer; } }
定义MacBook 的创建过程
package com.wehaicao.design; /** * @Author: WenQ * @Date: 2019/4/10 * @Description: Mac电脑构建 */ public class MacComputer implements IBuilder { Computer computer = null ; public MacComputer() { computer = new Computer(); } @Override public void buildCpu() { computer.setCpu("MacComputer 装配CPU"); } @Override public void buildMemory() { computer.setMemory("MacComputer 装配内存"); } @Override public void buildDisk() { computer.setDisk("MacComputer 装配磁盘"); } @Override public Computer getComputer() { return computer; } }
从现在已有代码,我们可以看出如果我们想要造一个MacBook,我们只需要调用MacBook 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取MacBook
同理,我们要制造ThinkPad,我们需要调用ThinkPad 的buildCpu,buildMemory,bulidDisk,最后调用getComputer方法返回具体产品即可获取ThinkPad .
那我们此时如果对制造过程做一个抽象,只需要要传入Ibuider接口实例,抽象方法帮我们对各个属性赋值不是更好么,所以:
就有了指挥者:
package com.wehaicao.design; /** * @Author: WenQ * @Date: 2019/4/10 * @Description: 指挥者,负责对象的创建过程 */ public class Director { public Computer createComputer(IBuilder abstactBuilder){ abstactBuilder.buildCpu(); abstactBuilder.buildDisk(); abstactBuilder.buildMemory(); return abstactBuilder.getComputer(); } }
自此,我们的假造者模式已经完成。如果需要MacBook,我们只需要new一个空的MacBook传递给Director实例的createComputer即可。
测试代码如下:
package com.wehaicao.design; /** * @Author: WenQ * @Date: 2019/4/10 * @Description: */ public class Test { public static void main(String[] args) { Director director = new Director(); Computer computer = director.createComputer(new MacComputer()); Computer computer1 = director.createComputer(new ThinkPadComputer()); System.out.println(computer1); System.out.println(computer); } }
运行结果如下: