版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37639900/article/details/89200440
Java设计模式之构建者模式
构建者模式概述
构建者模式:构建者模式隐藏了复杂对象的创建过程,将一个复杂对象的创建和对象的表示进行分离,使得同样的构建过程可以创建不同的表示。它是创建型设计模式之一。
构建这模式的组成
一般情况下,构建者模式由以下四个部分组成:
- Builder: 抽象构造者对复杂对象的创建过程加以抽象,给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建,一般由子类实现
- ConcreteBuilder: 具体的构造者实现Builder类中定义的所有抽象方法,并且返回一个组建好的对象。
- Product: 产品类构造者最终构造的对象
- Director:导演类主要用于负责安排已有模块的顺序,然后通知Builder开始构建
构建者模式的优缺点及适用场景
适用场景:
需要生成的产品对象有复杂的内部结构,并且这些产品对象具备相同的特性
优点:
- 具体的构建者之间相互独立、互不影响,易于扩展符合“开闭原则”
- 将复杂产品的表示和创建过程进行分离,易于解耦
缺点
- 产生多余的Builder对象以及导演类
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
构建者模式四步骤
此处已构建智能手机为例,详细的解释都在代码中标注,这里不做过多解释
1:构建产品类Product: 智能手机Phone
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:08
*
* desc : 智能手机的一般组成: cpu 手机键盘 主板 屏幕 相机 这就是我们要构建的复杂对象 即Product
* 这里通过get和set方法简单模拟复杂对象的各个部分的构建,意在理解
*/
public class Phone {
private String cpu;
private String keyboard;
private String processor;
private String screen;
private String camera;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getKeyboard() {
return keyboard;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public String getProcessor() {
return processor;
}
public void setProcessor(String processor) {
this.processor = processor;
}
public String getScreen() {
return screen;
}
public void setScreen(String display) {
this.screen = display;
}
public String getCamera() {
return camera;
}
public void setCamera(String camera) {
this.camera = camera;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", keyboard='" + keyboard + '\'' +
", processor='" + processor + '\'' +
", screen='" + screen + '\'' +
", camera='" + camera + '\'' +
'}';
}
}
2:构建抽象构建者Builder
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:14
* desc : 抽象构建者 :不涉及具体的构建过,具体的构建由子类实现
* version: ${VERSIONCODE}
*/
public abstract class Builder {
protected abstract void buildCpu(); //构建手机Cpu
protected abstract void buildKeyboard();//造键盘
protected abstract void buildProcessor();//造主板
protected abstract void buildScreen();//造手机屏
protected abstract void buildCamera();//造摄像机
protected abstract Phone build();//提供一个获取复杂对象的方法
}
3:构建具体的构建者ConcreteBuilder:
华为手机构建者BuilderHuawei
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:27
* desc :
* 具体的构建者:构建华为手机
* 这里只是简单的模拟了产品的各个部分的构建过过程,以便理解,其实每一步都可能有更加复杂的构建过程
* 而且苹果和华为的构建者互不影响,易于扩展功能
*
*/
public class BuilderHuawei extends Builder {
private Phone mPhone =new Phone();
@Override
protected void buildCpu() {
mPhone.setCpu("构建 华为的 cpu");
}
@Override
protected void buildKeyboard() {
mPhone.setCpu("构建 华为的 键盘");
}
@Override
protected void buildProcessor() {
mPhone.setCpu("构建 华为的 主板");
}
@Override
protected void buildScreen() {
mPhone.setCpu("构建 华为的 的全面屏");
}
@Override
protected void buildCamera() {
mPhone.setCpu("构建 华为的 摄像机");
}
@Override
protected Phone build() {
return mPhone;
}
}
苹果手机构建者BuilderIphone
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:16
* desc : BuilderIphone 构建苹果手机 具体的构建者
* 具体的构建者:
* 这里只是简单的模拟了产品的各个部分的构建过过程,以便理解,其实每一步都可能有更加复杂的构建过程
* 而且苹果和华为的构建者互不影响,易于扩展功能
*/
public class BuilderIphone extends Builder {
private Phone mPhone =new Phone();
@Override
protected void buildCpu() {
mPhone.setCpu("构建 iphonex cpu");
}
@Override
protected void buildKeyboard() {
mPhone.setCpu("构建 iphonex 键盘");
}
@Override
protected void buildProcessor() {
mPhone.setCpu("构建 iphonex 主板");
}
@Override
protected void buildScreen() {
mPhone.setCpu("构建 iphonex 的全面屏");
}
@Override
protected void buildCamera() {
mPhone.setCpu("构建 iphonex 摄像机");
}
@Override
protected Phone build() {
return mPhone;
}
}
4:构建Director安排已有模块的构建顺序,通知构建者构建
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:19
* desc :导演:
* 负责安排具体构建者的构建过程
*/
public class BuilderDirector {
private Builder mBuilder;
public BuilderDirector (Builder builder){
mBuilder=builder;
}
public Phone build(){
mBuilder.buildCpu();
mBuilder.buildCamera();
mBuilder.buildKeyboard();
mBuilder.buildProcessor();
mBuilder.buildScreen();
return mBuilder.build();
}
}
5:使用
/**
* Copyrights (c) 2019 All Rights Reserved
* author : 马彦虎 Ehud
* e-mail : [email protected]
* date : 2019/4/15/20:23
* desc :
* version: ${VERSIONCODE}
*/
public class TestBuilder {
public static void main(String[] args) {
//通过Director获取构建的Phone对象
Phone phoneHuawei=new BuilderDirector(new BuilderIphone()).build();
System.out.println("构建的华为手机 = " + phoneHuawei.toString());
Phone iphone = new BuilderDirector(new BuilderHuawei()).build();
System.out.println("构建的苹果手机= " + iphone.toString());
}
}