定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用
- 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
- 方便用户创建复杂的对象(不需要知道实现过程)
- 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
例子:
用户组装电脑 组装汽车 组装xxxx ,以及所有能构建的东西
UML类图
![](https://img.haomeiwen.com/i8796361/2780db0780403258.png)
角色讲解:
- 指挥者(Director)直接和客户(Client)进行需求沟通;
- 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
- 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
- 各个具体建造者负责进行产品部件的构建;
- 最终构建成具体产品(Product)。
简单案例
实例概况
- 背景:Zero希望去电脑城买一台组装的 MAC电脑
- 过程:电脑城老板(Diretor)和Zero(Client)进行需求沟通(要啥配置),了解需求后,电脑城老板将Zero需要的主机划分为各个部件(Builder)的建造请求(CPU、主板、显示器等等),指挥 装机工程师(ConcreteBuilder)去构建主机,将组件组装起来成Zero需要的电脑(Product)
//装机工程师
public abstract class Builder {
//装主板
public abstract void buildBoard(String mBoard) ;
//装显示屏
public abstract void buildDisplay(String mDisplay) ;
//装系统
public abstract void buildOS();
//产品:装好的电脑
public abstract Computer create();
}
//老板
public class Director {
Builder builder ;
public Director(Builder builder) {
super();
this.builder = builder;
}
/**根据客户的配置指挥装机工程师去建造*/
public void construct(String mBoard,String mDisplay) {
builder.buildBoard(mBoard);
builder.buildDisplay(mDisplay);
builder.buildOS();
}
}
//组装的电脑
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
//设置主板
public void setBoard(String mBoard) {
this.mBoard = mBoard;
}
//设置显示器
public void setDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
//设置系统
public abstract void setOS();
@Override
public String toString() {
return "Computer [mBoard=" + mBoard + ", mDisplay=" + mDisplay + ", mOS=" + mOS + "]";
}
}
具体的装机工程师 和具体的电脑
public class MacBook extends Computer {
@Override
public void setOS() {
this.mOS = "MAC OS X 10.10";
}
}
//MAC装机工程师 系统已经内置了,只需要把主板和显示屏装一下就可以完成了
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
@Override
public void buildBoard(String mBoard) {
computer.setBoard(mBoard);
}
@Override
public void buildDisplay(String mDisplay) {
computer.setDisplay(mDisplay);
}
@Override
public void buildOS() {
computer.setOS();
}
@Override
public Computer create() {
return computer;
}
}
客户Zero 去电脑店买MAC电脑,并把配置说了下。主板要英特尔的,显示屏便宜点的就好。
public class Client {
public static void main(String[] args) {
//找到对应工程师
Builder b = new MacBookBuilder();
//跟老板说配置
Director d = new Director(b);
d.construct("英特尔", "山寨显示器");
//电脑构建好了,并显示出来
System.out.println(b.create().toString());
}
}
通过上述这个常见的生活例子,我相信你已经完全明白了建造者模式的原理了!!
优缺点
优点:
-
易于解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。 -
易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰 -
易于拓展
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
网友评论