有哪些创建型模式
1.单例模式 2.工厂模式 3.原型模式 4.建造者模式
接下来针对以上4种设计模式进行单独讲解
4 建造者模式
4.1 定义
将复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示
建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离。客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需的建造者类型即可。建造者模式关注如何一步一步地创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立
4.2 应用场景
对象的创建比较复杂,创建对象过程中有多个具体的步骤,spring中的BeanDefinitionBuilder便是建造者模式的应用
4.3 UML图
从上面UML图中可以看出
Builder作为抽象建造者定义了该复杂对象的建造过程,一般有两种类型的函数,一是buildPartX表示该复杂对象的建造过程,一是getResult表示获取的最终对象
ConcreteBuilder作为具体的建造者负责实现具体的builder逻辑
Product表示要具体建造的复杂对象
Director负责安排Product对象的具体建造流程,Director持有抽象Builder,并且在construct中明确该对象的建造流程,客户端只需要和Director类进行交互即可完成对象的构建
4.4 具体代码实现
public class Product {
private String partA;
private String partB;
private String partC;
public Product(String partA, String partB, String partC) {
this.partA = partA;
this.partB = partB;
this.partC = partC;
}
public void displayProduct() {
System.out.println("Part A: " + partA);
System.out.println("Part B: " + partB);
System.out.println("Part C: " + partC);
}
}
// Builder抽象建造者定义了Product对象的构建过程
public interface Builder {
void setPartA();
void setPartB();
void setPartC();
Product getResult();
}
// ConcreteBuilder是具体的建造者,实现了Builder接口的抽象方法
public class ConcreteBuilder implements Builder {
private Product product;
public ConcreteBuilder() {
this.product = new Product("Part A", "Part B", "Part C");
}
@Override
public void setPartA() {
// 在具体实现中设置PartA的逻辑
product.partA = "Concrete Part A";
}
@Override
public void setPartB() {
// 在具体实现中设置PartB的逻辑
product.partB = "Concrete Part B";
}
@Override
public void setPartC() {
// 在具体实现中设置PartC的逻辑
product.partC = "Concrete Part C";
}
@Override
public Product getResult() {
return product;
}
}
// Director类负责安排Product对象的构建流程, Director持有抽象Builder, 并且在construct中明确该对象的建造流程
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.setPartA();
builder.setPartB();
builder.setPartC();
}
}
// 客户端只需要和Director类进行交互即可完成对象的构建
public class Client {
public static void main(String[] args) {
Director director = new Director(new ConcreteBuilder());
director.construct();
Product product = director.getBuilder().getResult();
product.displayProduct();
}
}
4.5 扩展
通常可以省略掉Director类,将construct方法直接写在Builder类中,此时代码可以简化
public class Builder {
private Product product;
public Builder() {
this.product = new Product("Part A", "Part B", "Part C");
}
public void setPartA() {
// 在具体实现中设置 Part A 的逻辑
product.setPartA("Concrete Part A");
}
public void setPartB() {
// 在具体实现中设置 Part B 的逻辑
product.setPartB("Concrete Part B");
}
public void setPartC() {
// 在具体实现中设置 Part C 的逻辑
product.setPartC("Concrete Part C");
}
public Product construct() {
// 在具体实现中安排构建对象的流程
setPartA();
setPartB();
setPartC();
return product;
}
}
public class Client {
public static void main(String[] args) {
Builder builder = new Builder();
Product product = builder.construct();
product.displayProduct();
}
}
甚至也可以将construct方法放在客户端
public class Builder {
private Product product;
public Builder() {
this.product = new Product("Part A", "Part B", "Part C");
}
public void setPartA() {
// 在具体实现中设置 Part A 的逻辑
product.setPartA("Concrete Part A");
}
public void setPartB() {
// 在具体实现中设置 Part B 的逻辑
product.setPartB("Concrete Part B");
}
public void setPartC() {
// 在具体实现中设置 Part C 的逻辑
product.setPartC("Concrete Part C");
}
public Product getResult() {
return product;
}
}
public class Client {
public static void main(String[] args) {
Builder builder = new Builder();
builder.setPartA();
builder.setPartB();
builder.setPartC();
Product product = builder.getResult();
product.displayProduct();
}
}
作者:qtlq
链接:juejin.cn/post/729081…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。