建造者模式:把工人(对象组件的建造者ComputerCreator)给主管(Director),让主管告诉工人如何一步一步创建产品。
各司其职,主管知道该怎么创建对象,但是不会创建具体的对象模块。工人会创建具体的模块但是不知道给怎样一步一步创建。两者组合创建出需要的对象。
优势:把复杂对象的各个模块的具体创建和各个模块的组合分隔开,封装创建过程,避免在创建过程出错。
可以方便扩展同一类型的对象,只需添加一个Creator即可。
示例说明:用IBM和Lenovo的员工创建出各自的电脑。
类图如下:
看代码:
ComputerCreator:定义所有的员工技能
package com.zpj.designMode.builderpattern; public interface ComputerCreator { public void createCPU(); public void createMainboard(); public void createHardDisk(); public void createDisplay(); }
IBMCreator 具体员工的实现
package com.zpj.designMode.builderpattern; public class IBMCreator implements ComputerCreator { //按照IBM的组件型号创建各个组件 @Override public void createCPU() { } @Override public void createMainboard() { } @Override public void createHardDisk() { } @Override public void createDisplay() { } }
LenovoCreator 具体员工的实现
package com.zpj.designMode.builderpattern; public class LenovoCreator implements ComputerCreator { //按照Lenovo的组件型号创建各个组件 @Override public void createCPU() { } @Override public void createMainboard() { } @Override public void createHardDisk() { } @Override public void createDisplay() { } }
只有Director 才知道电脑创建流程,你给他工人,他来告诉工人怎么创建。
package com.zpj.designMode.builderpattern; public class Director { private ComputerCreator creator; public Director(ComputerCreator creator) { super(); this.creator = creator; } //只有Director才知道该如何建造电脑,执行创建顺序是什么,都需要那些步骤。 //creator是不知道的,员工只会制作一个个组件,但是不知道创建一个电脑需要哪些组件以及创建顺序 //所有电脑的制造流程是一样的,不一样的是电脑的各个组件型号不同 public void createComputer() { creator.createCPU(); creator.createDisplay(); creator.createHardDisk(); creator.createMainboard(); } }
测试类:
package com.zpj.designMode.builderpattern; import org.junit.Test; public class BuilderPatternTest { @Test public void test01(){ //给主管一个IBM的员工让主管告诉IBM的员工怎么创建一个IBM电脑 Director IBMDirector = new Director(new IBMCreator()); IBMDirector.createComputer(); //给主管一个Lenovo的员工让主管告诉IBM的员工怎么创建一个IBM电脑 Director lenovoDirector = new Director(new LenovoCreator()); lenovoDirector.createComputer(); } }
此模式的目的就是为了避免创建复杂对象(对象需要由多个模块进行组合)出现问题,而把其创建过程封装起来,当使用的时候直接调用Director来进行创建,不需要调用处自行创建对象,减小错误的产生几率。
同时又实现了同一类型不同属性对象的灵活扩充。例如可以随意扩展多个个TCLComputer、ASUSComputer,来实现不同类型的Computer创建。