作者:手机用户2502906803 | 来源:互联网 | 2023-09-23 17:57
目的:将产品与产品的创建过程解耦。他是按照相应的步骤来构建产品下面看一下UML序列图对于序列图的一个解释下面来上一个标准代码Product.javapackage
目的:将产品与产品的创建过程解耦 。他是按照相应的步骤来构建产品
![](https://img2.php1.cn/3cdc5/3ce1/4aa/9926cf6f2cc4f905.png)
下面看一下UML序列图
![](https://img2.php1.cn/3cdc5/3ce1/4aa/94d1e3f883174b6f.png)
对于序列图的一个解释
![](https://img2.php1.cn/3cdc5/3ce1/4aa/49cec6437937cd14.png)
下面来上一个标准代码
Product.java
package com.pxx;public class Product {private String shape;private int height;private String color;public Product(String shape, int height, String color) {this.shape = shape;this.height = height;this.color = color;}public String getShape() {return shape;}public void setShape(String shape) {this.shape = shape;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "com.pxx.Product{" +"shape='" + shape + '\'' +", , color='" + color + '\'' +'}';}}
建造者的抽象类或者接口
ProductBuilder.java
package com.pxx;public interface ProductBuilder {//定义好产品相关的各种操作void buildShape();void buildHeight();void buildColor();Product buildProduct();
}
下面是具体的构建者对象
AoliaoConcreteBuilder.java
package com.pxx;public class AoliaoConcreteBuilder implements ProductBuilder {//这里面必须聚合一个产品类Product product;//这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品//传进来之后再来构建相关参数public AoliaoConcreteBuilder(String shape,int height,String color) {//这里就已经赋值了this.product = new Product(shape,height,color);}@Overridepublic void buildShape() {System.out.println("奥利奥形状:" +product.getShape());}@Overridepublic void buildHeight() {System.out.println("奥利奥高度:" + product.getHeight() + "厘米");}@Overridepublic void buildColor() {System.out.println("奥利奥颜色:" + product.getColor());}//返回这个对象public Product buildProduct() {return product;}
}
Director.java
package com.pxx;public class Director {//这里面我们需要调用ProductBuilder里面所有方法(这个是所有建造者的父类,也就是说,只要实现它的建造者都能传进来)//并且最后给我们返回一个对象//注意这个对象不是直接给我们运行//相当于是一个分发的结果private ProductBuilder productBuilder;//这里可以直接传入比如Aoliao这个对象,因为是实现ProductBuilderpublic Director(ProductBuilder productBuilder) {this.productBuilder = productBuilder;}public Product constructProduct() {productBuilder.buildShape();productBuilder.buildHeight();productBuilder.buildColor();return productBuilder.buildProduct();}
}
看一下客户端Client.java
package com.pxx;public class Client {public static void main(String[] args) {//有一个奥利奥的具体构建者对象AoliaoConcreteBuilder aoliao = new AoliaoConcreteBuilder("圆形",2,"蓝色");//利用Director来调用具体的构建者Director director = new Director(aoliao);//要调用这个对象的方法Product p = director.constructProduct();//这里就开始构建System.out.println(p);}
}
运行结果
上面就是标准建造者模式一个表示 。
上面代码还是要进行一个重构,这里我们这里是可以采用链式编程
![](https://img2.php1.cn/3cdc5/3ce1/4aa/71f84db1667d2915.png)
我们需要反复拿这个建造者对象一直调用吗? 不需要,调用一下,然后返回当前调用者对象就可以了。
代码重构
ProductBuilder.java
package com.pxx;public interface ProductBuilder {//定义好产品相关的各种操作AoliaoConcreteBuilder buildShape();AoliaoConcreteBuilder buildHeight();AoliaoConcreteBuilder buildColor();Product buildProduct();
}
AoliaoConcreteBuilder.java
package com.pxx;public class AoliaoConcreteBuilder implements ProductBuilder {//这里面必须聚合一个产品类Product product;//这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品//传进来之后再来构建相关参数public AoliaoConcreteBuilder(String shape,int height,String color) {//这里就已经赋值了this.product = new Product(shape,height,color);}@Overridepublic AoliaoConcreteBuilder buildShape() {System.out.println("奥利奥形状:" +product.getShape());return this;}@Overridepublic AoliaoConcreteBuilder buildHeight() {System.out.println("奥利奥高度:" + product.getHeight() + "厘米");return this;}@Overridepublic AoliaoConcreteBuilder buildColor() {System.out.println("奥利奥颜色:" + product.getColor());return this;}//返回这个对象public Product buildProduct() {return product;}
}
Director.java
![](https://img2.php1.cn/3cdc5/3ce1/4aa/ad61f9f26e9a23b7.png)
运行结果
其实,说一下,有时候这个建造者模式组件表现的不会那么齐全,比如我们稍微去看一下StringBuilder的源码
看到这个StringBuilder后面有个Builder就应该猜出来,它是一个建造者或者建造者的抽象层
![](https://img2.php1.cn/3cdc5/3ce1/4aa/7770fcc5f2596bab.png)
我们可以看到StringBuilder继承了一个AbstractStringBuilder类,这个就像是具体的建造者对象去实现了建造者抽象
再去看一下AbstractStringBuilder类
![](https://img2.php1.cn/3cdc5/3ce1/4aa/920e07e23362107a.png)
那么一看这个类就是一个抽象类,这是不是就让我们想起建造者抽象,但是它还不是,我们继续往下追。
![](https://img2.php1.cn/3cdc5/3ce1/4aa/495515f54b3ed29d.png)
这里面就有我们常用的append抽象方法
这个就可以理解为建造者抽象,产品的话可以考虑为没有。
![](https://img2.php1.cn/3cdc5/3ce1/4aa/471cebe7efe5cf8e.png)
而且这个里面方法都是链式编程
![](https://img2.php1.cn/3cdc5/3ce1/4aa/1865688a95669d7d.png)
这个this就是一个StringBuilder的一个具体的对象。
好了,这个建造者模式先说到这。