写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。
建造者模式(Builder)
是一种创建型模式。
目录
一、概述
二、使用步骤
三、Java代码实现
一、概述
1、将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;2、建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
1.1、主要的角色有3种,但从代码(或技术)实现的角度看(为了充分使用面向对象语言的3大特性封装、继承、多态,还另外需要抽象类或接口)有4个:
- 需要被创建的对象(单个):为了方便起见,我们称它为产品;
- 建造者的抽象类或接口(单个)+ 建造者的实现类(多个):将产品的创建步骤分开,并封装;
- 指挥官(单个):调用建造者的实现类,完成产品的创建。
1.2、 直观的理解上这些角色之间的关系如下:
1.3、通过技术实现的角度看,对象之间关系的UML图如下:
二、使用步骤
- 分析产品(有待被创建的对象)在创建的过程中都有哪些步骤;
- 将这些步骤封装到建造者类的方法当中;
- 然后再创建指挥官类去根据需要调用建造者提供的方法;
- 最后,在主程序中需要创建指挥官和对应的建造者实体类,并调用相关的方法去获取产品实例对象。
三、Java代码实现
3.1、对象之间的关系用UML图表示如下:
3.2、Java实现代码如下(建议你在本地试一下,加深印象):
产品类:
public class Product {
List<String> parts = new LinkedList<>();
public void add(String part) {
parts.add(part);
}
public void show() {
for (String part : parts) {
System.out.println(part);
}
}
}
建造者抽象类:
abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
具体的建造者1:
public class ConcreteBuilder1 extends Builder {
private Product product = null;
public ConcreteBuilder1() {
this.product = new Product();
}
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
具体的建造者2:
public class ConcreteBuilder2 extends Builder {
private Product product = null;
public ConcreteBuilder2() {
this.product = new Product();
}
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
指挥官:
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
}
}
主程序(发起请求的类):
public class Main {
public static void main(String[] args) {
Director director = new Director();
//创建第一个产品实例对象
Builder builder1 = new ConcreteBuilder1();
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
System.out.println("-----");
//创建第二个产品实例对象
Builder builder2 = new ConcreteBuilder2();
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!