建造者模式是什么?
建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用于专门创建个性化的对象。区别于工厂,每个工厂生产出来的产品都是一样的,而建造者可以根据用户的不同需要,生产不同的产品。
其中包含角色:
Builder:抽象建造者
ConcreteBuilder:具体建造者
Director:指挥者/监工
Product:产品
建造者模式可以干嘛?
主要用来创建个性化的产品,主要解决同一样的产品输出不同的个性化要求。比如:你需要一台台式电脑,其中包含:显示器、机箱(主板、内存条、显卡、硬盘、键盘、鼠标)等,如果是工厂模式,每个工厂输出的产品都是一模一样的配置。而如果是建造者模式,可以个性化选配,比如高配和低配。而其中你(指挥者)、电脑(产品)、装电脑人员(具体建造者)、抽象建造者(人/组装人员)
优点:
解耦:不同的组件可以个性化选择,精细化的控制每个产品的创建过程;
易拓展:新增加一些属性和功能很方便;
符合开闭原则:原功能不受影响,需要新的功能在基础上增加就可以了;
缺点:
该模式只适合创建出来的产品存在很多共同点,而不是差异性很大,所以使用范围受到一定的限制;
如果产品内部过于复杂,会导致代码可读性降低,代码臃肿;
类图
注意:建议先看下这个类图,若不懂请看到懂为止,实在看不懂多找点资料吧,我是踩过坑的,需要要了解一下原理!切记!切记!切记!
实现代码
代码语言:javascript复制package com.hong.base.buildmodel.computer;
/**
* @Auther: csh
* @Date: 2020/5/18 11:17
* @Description:抽象电脑(抽象产品)
*/
public class Computer {
//cpu
private String cpu;
//品牌
private String brand;
//主板
private String mainBorad;
//显示器
private String displayer;
//价格
private String money;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getMainBorad() {
return mainBorad;
}
public void setMainBorad(String mainBorad) {
this.mainBorad = mainBorad;
}
public String getDisplayer() {
return displayer;
}
public void setDisplayer(String displayer) {
this.displayer = displayer;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "Computer{"
"cpu='" cpu '''
", brand='" brand '''
", mainBorad='" mainBorad '''
", displayer='" displayer '''
", money='" money '''
'}';
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 11:13
* @Description:抽象建造者
*/
public abstract class Builder {
//吕牌
public abstract void buildBrand();
//cpu
public abstract void buildCpu();
//主版
public abstract void buildMainBoard();
//显示器
public abstract void buildDisplay();
//获取电脑
public abstract Computer getComputer();
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 11:49
* @Description:戴尔笔记本(builder角色)
*/
public class DellComputerBuilder extends Builder {
private Computer computer = new Computer();
@Override
public void buildBrand() {
computer.setBrand("戴尔笔记本");
}
@Override
public void buildCpu() {
computer.setCpu("16核");
}
@Override
public void buildMainBoard() {
computer.setMainBorad("1万块主板");
}
@Override
public void buildDisplay() {
computer.setDisplayer("戴尔显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 14:11
* @Description:联想建造者
*/
public class LenovoComputerBuilder extends Builder {
private Computer computer = new Computer();
@Override
public void buildBrand() {
computer.setBrand("联想电脑");
}
@Override
public void buildCpu() {
computer.setCpu("低配版");
}
@Override
public void buildMainBoard() {
computer.setMainBorad("低配主板");
}
@Override
public void buildDisplay() {
computer.setDisplayer("16寸显示器");
}
@Override
public Computer getComputer() {
return computer;
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 14:13
* @Description:组装类(指挥者)
* 该类是指挥拼专的,就像以前的监工
*/
public class ComputerDirector {
public Computer construct(Builder builder){
//构建产品
Computer computer;
builder.buildBrand();
builder.buildCpu();
builder.buildDisplay();
builder.buildMainBoard();
computer = builder.getComputer();
return computer;
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 14:15
* @Description:建造者模式测试
*/
public class Client {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
Computer construct = director.construct(new LenovoComputerBuilder());
System.out.println(construct);
System.out.println("-----------------------------------------------");
Computer construct1 = director.construct(new DellComputerBuilder());
System.out.println(construct1);
}
}
结果
代码语言:javascript复制Computer{cpu='低配版', brand='联想电脑', mainBorad='低配主板', displayer='16寸显示器', money='null'}
--------------------
Computer{cpu='16核', brand='戴尔笔记本', mainBorad='1万块主板', displayer='戴尔显示器', money='null'}
实现场景
日常开发过程中,遇到一些组件经常变换,这种就比较适合建造者模式了,比如同一部手机有不同的颜色,不同的配置,但是基础的外型是一致的。