建造者模式
何为建造者模式?
建造者模式能够将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这句话理解起来可能有点抽象,简单来说就是调用相同的创建对象的方法(建造过程)可以创建出不同的对象。
建造者模式和抽象工厂模式不同比较
- 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
- 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
- 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。
建造者模式的结构
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 retrieveResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在导演者中不涉及具体产品的信息。
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
一般情况之下,指挥者是和客户端打交道的一个角色,指挥者将客户端创建的产品的请求划分为对各个零件的建造请求,在将这些请求委派给具体建造者角色,具体建造者角色是做具体建造工作的,但是却是不让客户端知道的。
案例分析
还是举例来说明吧,如果说我要创建一部手机,我需要先制造手机的几个核心部件,例如:屏幕、电池、听筒、话筒、机身等。
Product(产品角色)
public class MobilePhone {
//手机屏幕
private String screen;
//电池
private String battery;
//话筒
private String microphone;
//听筒
private String phoneReceiver;
//机身
private String phoneBody;
}
Builder(抽象建造者)
每一部手机都是这个类的对象,在创建一部手机的时候都要保证这几个核心部件的创建。所以创建手机是需要一个标准规范的,因为这几个核心部件都可以是不同的型号,不同的型号的部件制造出来的手机也是不同的,这样就有了下面建造规范的接口。
public interface IBuildPhone {
/**
* 建造者手机屏幕
*/
void buildScreen();
/**
* 建造手机电池
*/
void buildBattery();
/**
* 建造手机听筒
*/
void buildMicrophone();
/**
* 建造手机话筒
*/
void buildPhoneReceiver();
/**
* 建造手机机身
*/
void buildPhoneBody();
/**
* 创建手机
* @return
*/
MobilePhone retrieveResult();
}
ConcreteBuilder(具体建造者)
有了规范了,就可以创建手机了,先创建一个 OnePuls 手机。
public class OnePuls implements IBuildPhone {
private MobilePhone mobilePhone;
public OnePuls() {
this.mobilePhone = new MobilePhone();
}
@Override
public void buildScreen() {
mobilePhone.setScreen("高清显示屏");
}
@Override
public void buildBattery() {
mobilePhone.setBattery("3500mAh电池容量");
}
@Override
public void buildMicrophone() {
mobilePhone.setMicrophone("智能听筒");
}
@Override
public void buildPhoneReceiver() {
mobilePhone.setPhoneReceiver("智能话筒");
}
@Override
public void buildPhoneBody() {
mobilePhone.setPhoneBody("太空材质打造机身");
}
@Override
public MobilePhone retrieveResult() {
return mobilePhone;
}
}
Director(指挥者)
指挥者 它决定了手机的实现过程,然后给你一个完美的手机,Director角色:
public class Director {
public MobilePhone createMobilePhone(IBuildPhone buildPhone){
buildPhone.buildBattery();
buildPhone.buildMicrophone();
buildPhone.buildScreen();
buildPhone.buildPhoneReceiver();
buildPhone.buildPhoneBody();
return buildPhone.retrieveResult();
}
}
测试以及测试对应结果
public class Client {
public static void main(String[] args){
//创建一个 OnePuls 手机
MobilePhone onePuls = new Director().createMobilePhone(new OnePuls());
System.out.println(onePuls);
//创建一个 IPhoneX 手机
MobilePhone iPhoneX = new Director().createMobilePhone(new IPhoneX());
System.out.println(iPhoneX);
}
}
MobilePhone{screen='高清显示屏', battery='3500mAh电池容量', microphone='智能听筒', phoneReceiver='智能话筒', phoneBody='太空材质打造机身'}
MobilePhone{screen='OLED显示屏', battery='3000mAh电池容量', microphone='听筒', phoneReceiver='话筒', phoneBody='iPhoneX机身'}
UML类图
代码案例相关文件
http://pvyob7cem.bkt.clouddn.com/builder.rar
上述案例参考自:纪莫
https://www.cnblogs.com/jimoer/p/9265543.html