造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
主要有4个对象
1 Builder (抽象建造者 => 工人模范)
2 ConcreateBuilder (具体的建造者 => 招到的工人)
3 Director (具体指挥者 => 监督的总管)
4 Product (需要的产品)
举个例子
比如我要做牛肉汉堡和红烧肉炒饭
1、 我要先建立一个工人模范 来规范我可能招到的厨师
2、 我要将这两个食物所需要的工序写出来
3、 招很多工人,要开始动工这两道菜
4、 再挖一个总工来监督工序
5、 直接在总工那里得到产品的实例
直接上代码
Builder => 工人需要会做的事情
Product => 产品需要的制作工序
Builder_1 => 招到的第一类工人
Builder_2 => 招到的第二类工人
Director => 挖到了总工
Main => 通过叫总工指挥工人来获得产品
public class t09_pro {
public static void main(String[] args) {
Director director = new Director();
Product product_1 = director.create(new Builder_1());
Product product_2 = director.create(new Builder_2());
var p1 = product_1.toString();
var p2 = product_2.toString();
System.out.println(p1+"\n"+p2);
}
}
interface Builder{
void buildPart_1();
void buildPart_2();
void buildPart_3();
Product getProduct();
}
class Product{
private String part1;
private String part2;
private String part3;
private String name;
public String getPart1() {
return part1;
}
public void setName(String name) {
this.name = name;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public String getPart3() {
return part3;
}
public void setPart3(String part3) {
this.part3 = part3;
}
@Override
public String toString(){
return part1+"\n"+part2+"\n"+part3+"\n"+this.name+"已经做好";
}
}
class Builder_1 implements Builder{
private Product product;
public Builder_1(){
this.product = new Product();
this.product.setName("牛肉汉堡");
}
@Override
public void buildPart_1() {
this.product.setPart1("面包");
}
@Override
public void buildPart_2() {
this.product.setPart2("牛肉");
}
@Override
public void buildPart_3() {
this.product.setPart3("沙拉酱");
}
@Override
public Product getProduct() {
return this.product;
}
}
class Builder_2 implements Builder{
private Product product;
public Builder_2(){
this.product = new Product();
this.product.setName("红烧肉炒饭");
}
@Override
public void buildPart_1() {
this.product.setPart1("米饭");
}
@Override
public void buildPart_2() {
this.product.setPart2("红烧肉");
}
@Override
public void buildPart_3() {
this.product.setPart3("酱汁");
}
@Override
public Product getProduct() {
return this.product;
}
}
class Director{
public Product create(Builder builder){
builder.buildPart_1();
builder.buildPart_2();
builder.buildPart_3();
return builder.getProduct();
}
}