建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程;通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来,使得同样的构建过程可以创建不同的对象;并且每个具体建造者都相互独立,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
package com.lq.builder;
/**
* @author lq
* @PACKAGE_NAME: com.lq.builder
* @CLASS_NAME: Product
* @date 2022/11/13 11:46
* @Description: 产品类
*/
public class Product {
private String name;
private String type;
public void showProduct() {
System.out.println("名称:" + name);
System.out.println("型号:" + type);
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
}
package com.lq.builder;
/**
* @author lq
* @PACKAGE_NAME: com.lq.builder
* @CLASS_NAME: Builder
* @date 2022/11/13 11:46
* @Description: 抽象建造者
*/
public abstract class Builder {
public abstract void setPart(String arg1, String arg2);
public abstract Product getProduct();
}
package com.lq.builder;
/**
* @author lq
* @PACKAGE_NAME: com.lq.builder
* @CLASS_NAME: ConcreteBuilder
* @date 2022/11/13 11:47
* @Description: 建造者
*/
public class ConcreteBuilder extends Builder {
private Product product = new Product();
@Override
public Product getProduct() {
return product;
}
@Override
public void setPart(String arg1, String arg2) {
product.setName(arg1);
product.setType(arg2);
}
}
package com.lq.builder;
/**
* @author lq
* @PACKAGE_NAME: com.lq.builder
* @CLASS_NAME: Director
* @date 2022/11/13 11:48
* @Description: 导演类
*/
public class Director {
private Builder builder = new ConcreteBuilder();
public Product getAProduct() {
builder.setPart("宝马汽车", "X7");
return builder.getProduct();
}
public Product getBProduct() {
builder.setPart("奥迪汽车", "Q5");
return builder.getProduct();
}
}
package com.lq.builder;
/**
* @author lq
* @PACKAGE_NAME: com.lq.builder
* @CLASS_NAME: Client
* @date 2022/11/13 11:48
* @Description:
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
Product product1 = director.getAProduct();
product1.showProduct();
Product product2 = director.getBProduct();
product2.showProduct();
}
}
结果
名称:宝马汽车
型号:X7
名称:奥迪汽车
型号:Q5
两者都是创建型模式,并且最终都是得到一个产品,但两者的区别在于:
(1)抽象工厂模式就好比是一个一个的工厂,宝马车工厂生产宝马SUV和宝马VAN,奔驰车工厂生产奔驰车SUV和奔驰VAN,它是从一个更高
层次去看对象的构建,具体到工厂内部还有很多的车间,如制造引擎的车间、装配引擎的车间等,但这些都是隐藏在工厂内部的细节,对外不公
布。也就是对领导者来说,他只要关心一个工厂到底是生产什么产品的,不用关心具体怎么生产。
(2)建造者模式就不同了,它是由车间组成,不同的车间完成不同的创建和装配任务,一个完整的汽车生产过程需要引擎制造车间、引擎装
配车间的配合才能完成,它们配合的基础就是设计蓝图,而这个蓝图是掌握在车间主任(Director类)手中,它给建造车间什么蓝图就能生产什
么产品,建造者模式更关心建造过程。虽然从外界看来一个车间还是生产车辆,但是这个车间的转型是非常快的,只要重新设计一个蓝图,即可产
生不同的产品,这有赖于建造者模式的功劳。