一、简介
建造者模式(Builder Pattern)是五种创建型设计模式之一,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这句话怎么理解呢:一个对象的构建过程本质上就是这个对象包含的所有成员属性的构建过程,如果对象的属性非常多,属性本身组成复杂,甚至属性之间存在关联,那么该类的构建过程就显得很麻烦,如果所有代码都定义在本类中,代码会显得很臃肿甚至条理不清,所以我们可以将类的属性构建过程独立剥离出来,用单独的一个类去承载,这个类就是建造者类。
建造者模式一般包含以下角色:
产品角色:要创建的复杂对象,一般包含多个组成部分,一般提供静态builder()方法来生成建造者。
建造者类: 用于构造复杂对象,灵活创建对象的各个组成部分,一般包含build()方法用于返回最终对象。可以提炼抽象层。
指挥者 :非必须角色,调用建造者的方法控制复杂对象构建,主要用于封装构建过程,进行代码复用。
优点
向客户端隐藏了复杂对象的构建细节。
将产品本身和产品的创建过程进行解耦,可以更加精细地控制产品的创建过程,使得相同的创建过程可以创建不同的产品对象。
通过引入指挥者,可以实现构建过程的复用。
建造者独立,易于扩展,同时提高代码的可读性和可维护性。
缺点
建造者模式增加了类的数量,所以增加了系统的复杂性。
产品的组成发生变化时,建造者类需要同步修改。
适用场景
需要生成的对象具有复杂的内部结构,有很多属性。
需要生成的对象内部属性之间存在一定的依赖关系或约束条件。
需要分离对象和对象的创建过程。
二、实现案例
构建一份肯德基套餐
假设我们需要构建一份肯德基套餐,一份套餐至少包含n份汉堡,n份小食,n份饮料。那么这样一份套餐的组合方式就有很多种了,如单人套餐,双人套餐,全家桶,任意搭配等。接下来我们使用建造者模式来创建这样的一份套餐。
代码实现
参考源码类实现
org.apache.flink.connector.kafka.source.KafkaSourceBuilder
org.apache.flink.connector.jdbc.JdbcExecutionOptions.Builder
// 产品类
// 产品就是一份肯德基套餐,包含汉堡,小食,饮料,且数量不限。
public class Product {
private List<String> burgers;//汉堡
private List<String> snacks;//小食
private List<String> drinks;//饮料
public Product(List<String> burgers, List<String> snacks, List<String> drinks) {
this.burgers = burgers;
this.snacks = snacks;
this.drinks = drinks;
}
//创建一个建造者类
public static ProductBuilder builder(){
return new ProductBuilder();
}
//展示套餐中的内容
public void showProduct() {
int i=burgers.size();
int j=snacks.size();
int k=drinks.size();
String res="已经创建了一份套餐,该套餐包含:"+"\n"
+i+"个汉堡,"+burgers.toString()+"\n"
+j+"份小食,"+snacks.toString()+"\n"
+k+"瓶饮料,"+drinks.toString();
System.out.println(res);
}
}
建造者类
建造者主要包含往套餐中加料的方法,如往套餐中加入一份具体的汉堡addBurger,一瓶具体的饮料addDrink等,最后提供一个build()方法,返回创建好的套餐
public class ProductBuilder {
private List<String> burgers;
private List<String> snacks;
private List<String> drinks;
public ProductBuilder() {
this.burgers = new ArrayList<>();
this.snacks = new ArrayList<>();
this.drinks = new ArrayList<>();
}
public ProductBuilder addBurger(String burger){
burgers.add(burger);
return this;
}
public ProductBuilder addSnack(String snack){
snacks.add(snack);
return this;
}
public ProductBuilder addDrink(String drink){
drinks.add(drink);
return this;
}
public Product build(){
return new Product(burgers,snacks,drinks);
}
}
测试类
创建一份任意搭配的套餐。
public class Test {
public static void main(String[] args) {
Product product=Product.builder()
.addBurger("奥尔良汉堡")
.addBurger("巧克力汉堡")
.addSnack("薯条")
.addDrink("中杯可乐")
.build();
product.showProduct();
}
}
指挥者(可选)
如果考虑代码复用性,还可以创建一个指挥者类,用于构建单人套餐,双人套餐等。
public class Director {
//创建单人套餐
public static Product createSingleProducts(){
return Product.builder()
.addBurger("奥尔良汉堡")
.addSnack("薯条")
.addDrink("中杯可乐")
.build();
}
//创建双人套餐
public static Product createDoubleProducts(){
return Product.builder()
.addBurger("奥尔良汉堡").addBurger("巧克力汉堡")
.addSnack("薯条").addSnack("蛋黄派")
.addDrink("中杯可乐").addDrink("热牛奶")
.build();
}
}
使用指挥者直接创建定制套餐
public class Test {
public static void main(String[] args) {
//创建双人套餐
Product product=Director.createDoubleProducts();
product.showProduct();
}
}
三、总结
本文详细介绍了Java建造者模式,通过模拟构建肯德基套餐的案例,让你轻松掌握建造者模式的原理和实现。Java建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,可以精细控制对象的每一个属性创建。这种模式建造者独立于产品对象,专职于产品的创建工作,能显著提高代码的可读性和可维护性。
本文转载自:http://t.csdn.cn/W4ZUW
评论区