场景介绍
建造者模式经常用在创建“细节”比较繁琐的类,比如,富士康需要装配苹果手机,他的步骤可能是,安装CPU、安装主板、安装内存条、安装摄像头、安装屏幕…………,此时,富士康又接到小米手机的订单,他的安装步骤与苹果的安装步骤一样,我们为了保证安装不出问题,比如忘记安装摄像头了,我们就可以尝试使用建造者模式,下面我们先看看UML图。
UML图
代码
Foxconn:这里模拟的富士康,不管你来的是小米手机的安装还是苹果实际的安装,只要你是PhoneBuilder的子类,我都可以安装,所以此时的Foxconn,就是建造者里面的指挥者,只和PhoneBuilder这个父类相关。
public class Foxconn {
public Phone
construct(PhoneBuilder phoneBuilder
){
phoneBuilder
.installCPU();
phoneBuilder
.installMainBoard();
phoneBuilder
.installMemory();
phoneBuilder
.installCamera();
phoneBuilder
.installScreen();
return phoneBuilder
.getPhone();
}
}
PhoneBuilder:相关于定义了手机通用的安装过程,而具体的每款手机的安装细节,在子类中实现。比如:MIBuilder和AppleBuilder。
package design
.builder
;
abstract class PhoneBuilder {
public abstract void installCPU();
public abstract void installMainBoard();
public abstract void installMemory();
public abstract void installCamera();
public abstract void installScreen();
public abstract Phone
getPhone();
}
class MIBuilder extends PhoneBuilder{
private Phone phone
= new Phone();
@Override
public void installCPU() {
phone
.setCPU("骁龙865");
}
@Override
public void installMainBoard() {
phone
.setMainBoard("双层 L’型的异形主板");
}
@Override
public void installMemory() {
phone
.setMemory("16GB");
}
@Override
public void installCamera() {
phone
.setCamera("4800万 像素超清主摄");
}
@Override
public void installScreen() {
phone
.setScreen("6.67″ AMOLED");
}
@Override
public Phone
getPhone() {
return phone
;
}
}
class AppleBuilder extends PhoneBuilder{
private Phone phone
= new Phone();
@Override
public void installCPU() {
phone
.setCPU("A14");
}
@Override
public void installMainBoard() {
phone
.setMainBoard("双层 L’型的异形主板");
}
@Override
public void installMemory() {
phone
.setMemory("16GB");
}
@Override
public void installCamera() {
phone
.setCamera("双摄系统:1200 万像素超广角及广角");
}
@Override
public void installScreen() {
phone
.setScreen("6.1″ AMOLED");
}
@Override
public Phone
getPhone() {
return phone
;
}
}
Phone:这个就是很正常的javaBean类了,没有什么特殊之处,下面省略了get方法
package design
.builder
;
public class Phone {
private String CPU
;
private String mainBoard
;
private String memory
;
private String camera
;
private String screen
;
public void setCPU(String CPU
) {
this.CPU
= CPU
;
}
public void setMainBoard(String mainBoard
) {
this.mainBoard
= mainBoard
;
}
public void setMemory(String memory
) {
this.memory
= memory
;
}
public void setCamera(String camera
) {
this.camera
= camera
;
}
public void setScreen(String screen
) {
this.screen
= screen
;
}
@Override
public String
toString() {
return "Phone{" +
"CPU='" + CPU
+ '\'' +
", mainBoard='" + mainBoard
+ '\'' +
", memory='" + memory
+ '\'' +
", camera='" + camera
+ '\'' +
", screen='" + screen
+ '\'' +
'}';
}
}
调用方式
public static void main(String
[] args
) {
Foxconn foxconn
= new Foxconn();
Phone mi
= foxconn
.construct(new MIBuilder());
System
.out
.println(mi
);
Phone apple
= foxconn
.construct(new AppleBuilder());
System
.out
.println(apple
);
}
总结
Foxconn(Director):和Builder的关系,符合依赖倒转,Foxconn面向的是接口编程,而不是MIBuilder等细节。建造者模式,可以有效的将复杂的Phone的创建过程,变成稳定的建造过程,如果建造过程有误,编译器会有效的提醒我们。