今天学习介绍建造者模式,该模式也是创建型模式之一。
定义:将一个复杂的对象的构建与他的表示分离开来,使得同样的创建过程,可以创建不同的表示
建造者模式是一步一步创建一个复杂的对象,它允许人们指定复杂对象的类型和内容就可以构建它们,用户不需要知道其内部的构建的细节。
首先贴上该模式的UML图
其中
Builder :建造者抽象类
ConcreteBuilder: builder实现类,具体的建造者
Director:指挥者,负责保证负责对象各个部分按照某种顺序创建
Product:产品
下面我们还是举手机的例子来用代码实现建造者模式,我们知道手机是由CPU,屏幕,主板,电池大致组成的
首先,我们创建product类
public class PhoneProduct {
//产品类
String cpu;
//主板
String mainBoard;
//屏幕
String screen;
//电池
String battery;
public String getCpu() {
return cpu;
}
public String getMainBoard() {
return mainBoard;
}
public String getScreen() {
return screen;
}
public String getBattery() {
return battery;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public void setScreen(String screen) {
this.screen = screen;
}
public void setBattery(String battery) {
this.battery = battery;
}
}
这个类中包含的get set方法,
然后我们创建接口类Builder
public interface Builder {
void setCpu(String cpuName);
void setMainboard(String cpuName);
void setScreen(String cpuName);
void setBattery(String cpuName);
PhoneProduct getPhone();
}
以及他的实现类
public class Concretebuilder implements Builder{
private final PhoneProduct phoneProduct;
public Concretebuilder() {
phoneProduct = new PhoneProduct();
}
@Override
public void setCpu(String cpuName) {
phoneProduct.setCpu(cpuName);
}
@Override
public void setMainboard(String cpuName) {
phoneProduct.setMainBoard(cpuName);
}
@Override
public void setScreen(String cpuName) {
phoneProduct.setScreen(cpuName);
}
@Override
public void setBattery(String cpuName) {
phoneProduct.setBattery(cpuName);
}
@Override
public PhoneProduct getPhone() {
return phoneProduct;
}
}
最后我们创建指挥者Director
public class Director {
private Builder builder;
public Director setBuilder(Builder builder){
this.builder=builder;
return this;
}
public PhoneProduct ceratXiaoMiProduct(){
this.builder.setBattery("小米的电池");
this.builder.setScreen("小米的屏幕");
this.builder.setCpu("小米的CPU");
this.builder.setMainboard("小米的主板");
return builder.getPhone();
}
public PhoneProduct ceratHuaweiMiProduct(){
this.builder.setBattery("华为的电池");
this.builder.setScreen("华为的屏幕");
this.builder.setCpu("华为的CPU");
this.builder.setMainboard("华为的主板");
return builder.getPhone();
}
}
其中有两个方法可以创建不同的手机
测试调用类
public class Test {
public static void main(String[] args) {
Builder builder=new Concretebuilder();
Director director=new Director();
PhoneProduct huaweiPhone = director.setBuilder(builder).ceratHuaweiMiProduct();
PhoneProduct xiaoMiPhone = director.setBuilder(builder).ceratXiaoMiProduct();
}
}
我们通过Director类的方法,完成了复杂实例的创建。一方面隔离了客户与生产过程,另一方面负责产品的生产过程。
与抽象工厂模式对比,建造者模式返回的是一个组装好的完整产品,而抽象工厂模式返回的是一系列相关的产品,这些产品组成了一个产品族
安卓中alertDialog 的创建使用即用到了建造者模式。