简述
建造者模式(又称生成器模式)使用多个简单的对象一步一步构建成一个复杂的对象。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
如在开发过程中需要创建一个复杂的对象(计算机对象),这个复杂对象由多个子部件按一定的步骤组合而成,计算机是由 CPU、主板、内存、硬盘、显卡、显示器、键盘等部件组装而成的,一般买电脑我们不会自己去组装计算机,而是将计算机的配置要求告诉销售,销售安排技术人员去组装计算机。
类似这些产品都是由多个部件构成的,各个部件可以灵活选择,但其创建步骤都大同小异。这类产品的创建无法用前面介绍的工厂模式描述,而建造者模式可以很好地描述该类产品的创建。
建造者模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这种设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
优点:
- 封装性好,构建对象过程和对象的表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响。
缺点:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者模式和工厂模式的区别:
建造者模式和工厂模式的关注点不同:建造者模式注重部件的组装过程,而工厂方法模式更注重部件的创建过程,但两者可以结合使用,当一些基本部件不会变,而其组合经常变化的时候,可以使用建造者模式。
使用场景
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
建造者模式的结构
建造者模式包含以下主要角色。
- 产品:它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者:实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息
uml类图
代码示例:
package com.tianye.designModel.impl;
/**
* @author 田野上的风筝
* @version V1.0
* @Description: 建造者模式
* @date 2020/12/7 19:51
*/
public class BuilderModelDemo {
public static void main(String[] args) {
Director director = new Director();
Prod build1 = director.build(new DellComputerBuilder());
System.out.println(build1);
Prod build = director.build(new HpComputerBuilder());
System.out.println(build);
}
}
//指挥者 抽象建造者 具体建造者 产品
class Director{
Prod build(Builder builder){
builder.setCPU();
builder.setGPU();
builder.setMemory();
builder.SetMouse();
builder.setScreen();
return builder.build();
}
}
//抽象建造者 规范建造者生产过程
abstract class Builder{
abstract void setCPU();
abstract void setScreen();
abstract void setMemory();
abstract void setGPU();
abstract void SetMouse();
abstract Prod build();
}
//具体建造者 戴尔
class DellComputerBuilder extends Builder{
private Prod prod = new Prod();
// public DellComputerBuilder(Prod prod) {
// this.prod = prod;
// }
@Override
void setCPU() {
this.prod.setCpu("i7");
}
@Override
void setScreen() {
Screen screen = new Screen();
screen.setName("京东方");
this.prod.setScreen(screen);
}
@Override
void setMemory() {
this.prod.setMemory("512G固态+2T机械硬盘");
}
@Override
void setGPU() {
this.prod.setGpu("1050TI");
}
@Override
void SetMouse() {
this.prod.setMouse("罗技鼠标");
}
@Override
Prod build() {
return prod;
}
}
//具体建造者 惠普
class HpComputerBuilder extends Builder{
private Prod prod = new Prod();
// public DellComputerBuilder(Prod prod) {
// this.prod = prod;
// }
@Override
void setCPU() {
this.prod.setCpu("i5");
}
@Override
void setScreen() {
Screen screen = new Screen();
screen.setName("京东方1");
this.prod.setScreen(screen);
}
@Override
void setMemory() {
this.prod.setMemory("128G固态+1T机械硬盘");
}
@Override
void setGPU() {
this.prod.setGpu("ctx 1050");
}
@Override
void SetMouse() {
this.prod.setMouse("雷神鼠标");
}
@Override
Prod build() {
return prod;
}
}
//产品
class Prod{
private String cpu;
private String gpu;
private String memory;
private String mouse;
private Screen screen;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getGpu() {
return gpu;
}
public void setGpu(String gpu) {
this.gpu = gpu;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
@Override
public String toString() {
return "Prod{" +
"cpu='" + cpu + '\'' +
", gpu='" + gpu + '\'' +
", memory='" + memory + '\'' +
", mouse='" + mouse + '\'' +
", screen=" + screen +
'}';
}
}
//屏幕
class Screen{
private String name;
@Override
public String toString() {
return "Screen{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
运行mian方法,效果
总结:建造者模式,适用于创建有复杂内部结构的对象,子部件之间相互依赖。