这个模式以前也义Android-kotlin的场景下讲过 Android 用建造者模式模式写一个Dialog-CSDN博客
不过用的是 变种的建造者模式
建造者模式: 属于创建型模式 提供了一种创建对象的最佳方式, 使用多个简单的对象一步一步构建成一个复杂的对象 。
介绍
- 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
- 主要解决问题:一些基本部件不会变,而其组合经常变化的时候。需要生成的对象具有复杂的内部结构,需要生成的对象内部属性本身相互依赖。
- 关键代码:实现与被代理类组合。
- 优点:1、建造者独立,易扩展。 2、便于控制细节风险。
- 缺点:1、产品必须有共同点,范围有限制。 2、如果内部变化复杂,会有很多的建造类。
以建造一个三角形圆形矩形的图形为例
-
角色类:包含多个组成部件的复杂对象
javapublic class Shape { private String triangle; private String circular; private String rectangle; public void setTriangle(String triangle) { this.triangle = triangle; } public void setCircular(String circular) { this.circular = circular; } public void setRectangle(String rectangle) { this.rectangle = rectangle; } public void draw() { //使用得到的具体的三角形圆形矩形绘制一个图形 } }
-
抽象建造者:包含创建产品各个子部件的抽象方法
javaabstract class Builder { protected Shape shape = new Shape(); public abstract void buildTriangle(); public abstract void buildCircular(); public abstract void buildRectangle(); public Shape getShape() { return shape; } }
-
具体建造者:实现了抽象建造者接口
javapublic class ConcreteBuilder1 extends Builder{ @Override public void buildTriangle() { shape.setTriangle("建造 红色三角形"); } @Override public void buildCircular() { shape.setCircular("建造 蓝色圆形"); } @Override public void buildRectangle() { shape.setRectangle("建造 绿色矩形"); } }
javapublic class ConcreteBuilder2 extends Builder{ @Override public void buildTriangle() { shape.setTriangle("建造 青色三角形"); } @Override public void buildCircular() { shape.setCircular("建造 蓝色圆形"); } @Override public void buildRectangle() { shape.setRectangle("建造 紫色矩形"); } }
-
指挥者:调用建造者中的方法完成复杂对象的创建。
javapublic class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } //产品构建与组装方法 public Shape construct() { builder.buildTriangle(); builder.buildCircular(); builder.buildRectangle(); return builder.getShape(); } }
-
使用
javapublic static void main(String[] args) { Builder builder = new ConcreteBuilder1(); Director director = new Director(builder); Shape shape = director.construct(); shape.draw(); builder = new ConcreteBuilder2(); director = new Director(builder); shape = director.construct(); shape.draw(); }