简介
1.指挥者(Director)直接和客户(Client)进行需求沟通;
2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
4. 各个具体建造者负责进行产品部件的构建;
5. 最终构建成具体产品(Product)
实例
1.电脑城老板(Diretor)和小成(Client)进行需求沟通(买来打游戏?学习?看片?)
2.了解需求后,电脑城老板将小成需要的主机划分为各个部件(Builder)的建造请求(CPU、主板blabla)
3.指挥装机人员(ConcreteBuilder)去构建组件;
4.将组件组装起来成小成需要的电脑(Computer)
UML
代码:
package com.sl.demo.builder;
import java.util.ArrayList;
import java.util.List;
/**
* 电脑
* @author pengkun
*
*/
public class Computer {
//电脑由小件组装而成
private List<String> parts=new ArrayList<>();
//电脑留有插零件的接口
public void add(String part) {
parts.add(part);
}
//展示自己(电脑属性)
public void showMe() {
for (String part : parts) {
System.out.println("组装了:"+part);
}
}
}
package com.sl.demo.builder;
/**
* 抽象组装人员
* @author pengkun
*
*/
public interface Builder {
//主板
void installMain() ;
//cpu
void installCPU();
//硬盘
void installHDD();
//内存
void installMemory();
//组装好返回电脑
Computer getComputer() ;
}
package com.sl.demo.builder;
/**
* 具体实现建造者
* @author pengkun
*
*/
public class ConcreteBuilder implements Builder {
//持有一台待组装的电脑
private Computer computer=new Computer();
@Override
public void installMain() {
computer.add("华硕主板");
}
@Override
public void installCPU() {
computer.add("core i8");
}
@Override
public void installHDD() {
computer.add("三星 SDD 512G");
}
@Override
public void installMemory() {
computer.add("金士顿 rd5 32G");
}
@Override
public Computer getComputer() {
return computer;
}
}
指挥者:
package com.sl.demo.builder;
/**
* 指挥者
* @author pengkun
*
*/
public class Director {
//叫实际建造者开始组装(根据需求构建,说白了组装电脑的配置由指挥者决定)
public void construct(Builder builder) {
builder.installMain();
builder.installCPU();
builder.installHDD();
builder.installMemory();
}
}
测试:
@Test
public void test() {
//老板
Director director=new Director();
//组装人员
Builder builder=new ConcreteBuilder();
//和老板商谈,然后老板根据需求指挥组装人员组装一台什么配置的电脑
director.construct(builder);
//组装人员拿来电脑
Computer computer= builder.getComputer();
computer.showMe();
}
结果:
组装了:华硕主板
组装了:core i8
组装了:三星 SDD 512G
组装了:金士顿 rd5 32G
建造者模式的优点
1)封装性:使用建造者模式可以是客户端不必知道产品内部组成的细节。
2)建造者独立,容易扩展
3)便于控制细节风险:由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影
缺点
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以使用建造者模式。
2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不想同时,可以使用建造者模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这时候可以使用建造者模式。
4)在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿的方法,因为一个对象不容易获得,而在设计阶段竟然没有发现,而要通过设计这模式来柔化创建过程,本身设计已经出问题了。
到这里,我们会发现,建造者模式和工厂方法模式有点像。但是两者有区别:建造者模式关注的是零件类型和装配工艺(顺序),而工厂模式是创建一个对象,这是最大不同的地方。