《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有:
该系列会逐步更新于我的博客和公众号(博客见文章底部)
也希望各位观众老爷能够关注我的个人公众号:后端技术漫谈,不会错过精彩好看的文章。
根据中文翻译的不同,建造者模式又可以称为生成器模式,它属于创建型模式。
复杂对象相当于一辆有待建造的汽车,而对象的属性相当于汽车的部件,建造产品的过程就相当于组合部件的过程。由于组合部件的过程很复杂,因此,这些部件的组合过程往往被“外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式,这就是建造者模式的模式动机。
我们常用的StringBuilder就是一个建造者模式的典型例子
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
如果看不懂UML类图,可以先粗略浏览下该图,想深入了解的话,可以继续谷歌,深入学习:
建造者模式包含如下角色:
下图是建造者模式得到UML图,可以看到:
时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。时序图中显示的是参与交互的对象及其对象之间消息交互的顺序。
我们可以大致浏览下时序图,如果感兴趣的小伙伴可以去深究一下:
一水杯工厂要生产各式各样的水杯,无论杯子是神马造型,但都包括绳子,帽子和杯体。以此模型创建各种类型的杯子。
cup–>Product类
public class Cup {
private String string; //绳子
private String cap; //帽子
private String cupBody; //杯体
public void setString(String string) {
this.string = string;
}
public void setCap(String cap) {
this.cap = cap;
}
public void setCupBody(String cupBody) {
this.cupBody = cupBody;
}
public void show() {
System.out.println("杯子生产完毕");
}
}
Builder–>Builder类
public abstract class Builder {
protected Cup cup = new Cup();
public abstract void buildString();
public abstract void buildCap();
public abstract void buildCupBody();
public Cup getResult() {
return cup;
}
}
ClassCup–>concrateBuilder类
public class ClassCup extends Builder {
@Override
public void buildString() {
cup.setString("生产绳子...");
System.out.println("生产绳子...");
}
@Override
public void buildCap() {
cup.setCap("生产帽子...");
System.out.println("生产帽子...");
}
@Override
public void buildCupBody() {
cup.setCupBody("生产杯体...");
System.out.println("生产杯体...");
}
}
Director类
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void create() {
builder.buildString();
builder.buildCap();
builder.buildCupBody();
builder.getResult().show();
}
public static void main(String[] args) {
Director d = new Director(new ClassCup());
d.create();
}
}
AbstractStringBuilder–>Builder类
public class AbstractStringBuilder {
protected char[] value;
protected int count;
public AbstractStringBuilder(int capacity) {
count = 0;
value = new char[capacity];
}
public AbstractStringBuilder append(char c) {
ensureCapacityInternal(count + 1);
value[count++] = c;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
}
StringBuilder–>concrateBuilder类
public class StringBuilder extends AbstractStringBuilder {
public StringBuilder() {
super(16);
}
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
}
Client–>Director类
public class Client {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
final int count = 26;
for (int i = 0; i < count; i++) {
sb.append((char) ('a' + i));
}
System.out.println(sb.toString());
}
}
https://blog.csdn.net/c275046758/article/details/50540789
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html