【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】
知识回顾:
之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】
【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】
【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】
【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】
【Java中23种面试常考的设计模式之装饰器模式(Decorator)—结构型模式】
【Java中23种面试常考的设计模式之外观模式(Facade)—结构型模式】
【Java中23种面试常考的设计模式之享元模式(Flyweight)—结构型模式】
【Java中23种面试常考的设计模式之代理模式(Proxy)—结构型模式】
【Java中23种面试常考的设计模式之单例模式(Singleton)—创建型模式】
【Java中23种面试常考的设计模式之原型模式(prototype)—创建型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】。
建造者模式
- 使用多个简单的对象一步一步构建成一个复杂的对象。
- 实际开发中,我们所需要的对象构建时非常复杂,且有很多步骤需要处理时,这时建造者模式就很适合。
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用
解决的问题
- 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
生产开发中常用的使用场景
- StringBuilder类的append方法
- SQL中的PreparedStatement
模式优点与缺点
优点
- 建造者独立,易扩展。
缺点
- 内部变化复杂,会有很多的建造类。
核心角色
指挥者Director:定义产品组装接口及组装的实现
抽象建造者Builder:定义我们的组件构造者
产品Product:最终的产品类
具体建造者ConcreteBuilder:定义我们的实现组件构造者
测试客户端类
UML类图
实现代码
最终产品类(以及三个组件内部类)
package com.builder;
/*
* 最终的产品类
*/
public class Product {
private PartA partA;
private PartB partB;
private PartC partC;
public Product() {
}
public Product(PartA partA, PartB partB, PartC partC) {
this.partA = partA;
this.partB = partB;
this.partC = partC;
}
public PartA getPartA() {
return partA;
}
public void setPartA(PartA partA) {
this.partA = partA;
}
public PartB getPartB() {
return partB;
}
public void setPartB(PartB partB) {
this.partB = partB;
}
public PartC getPartC() {
return partC;
}
public void setPartC(PartC partC) {
this.partC = partC;
}
public void show() {
System.out.println("成功建造对象以及内部组件:");
System.out.println(partA.toString() + "---" + partA.getName());
System.out.println(partB.toString() + "---" + partB.getName());
System.out.println(partC.toString() + "---" + partC.getName());
}
}
// Product产品类中的A对象
class PartA {
private String name;
public PartA() {
}
public PartA(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PartA [name=" + name + "]";
}
}
// Product产品类中的B对象
class PartB {
private String name;
public PartB() {
}
public PartB(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PartB [name=" + name + "]";
}
}
// Product产品类中的C对象
class PartC {
private String name;
public PartC() {
}
public PartC(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PartC [name=" + name + "]";
}
}
指挥者
package com.builder;
public class Director {
private Builder builder;
public Director() {
};
public Director(Builder builder) {
this.builder = builder;
}
public Product construct() {
return builder.getResult();
}
}
建造者
package com.builder;
public abstract class Builder {
protected Product product;
public Builder() {
};
public Builder(Product product) {
this.product = product;
}
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
public abstract Product getResult();
}
具体建造者
package com.builder;
public class ConcreteBuilder extends Builder {
public ConcreteBuilder(Product product) {
this.product = product;
}
@Override
public void buildPartA() {
// Auto-generated method stub
product.setPartA(new PartA("产品中的A部件"));
}
@Override
public void buildPartB() {
// Auto-generated method stub
product.setPartB(new PartB("产品中的B部件"));
}
@Override
public void buildPartC() {
// Auto-generated method stub
product.setPartC(new PartC("产品中的C部件"));
}
@Override
public Product getResult() {
buildPartA();
buildPartB();
buildPartC();
// Auto-generated method stub
return product;
}
}
Main函数测试类
package com.builder;
public class Main {
public static void main(String[] args) {
System.out.println(".........产品开始建造........");
Product product = new Product();
Builder builder = new ConcreteBuilder(product);
Director director = new Director(builder);
Product resProduct = director.construct();
System.out.println(".........产品建造结束........");
resProduct.show();
}
}
运行结果:
好了,到这里【Java中23种面试常考的设计模式之建造者模式(Builder)—创建型模式】,23种设计模式持续更新汇总中。