一、第一种方式
-
房子对象
public class Product {
private String buildA;//打地基
private String buildB;//垒砖造房子
private String buildC;//装修墙面
private String buildD;//验收房子
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+“房子验收完成”;
}
} -
建造者
abstract class Builder {
//地基
abstract void bulidA();
//钢筋工程
abstract void bulidB();
//铺电线
abstract void bulidC();
//粉刷
abstract void bulidD();
//完工-获取产品
abstract Product getProduct();
} -
具体建造者
public class ConcreteBuilder extends Builder{
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
void bulidA() {
product.setBuildA(“打地基”);
}
@Override
void bulidB() {
product.setBuildB(“垒砖造房子”);
}
@Override
void bulidC() {
product.setBuildC(“装修墙面”);
}
@Override
void bulidD() {
product.setBuildD(“验收房子”);
}
@Override
Product getProduct() {
return product;
}
} -
指挥建造者
public class Director {
//指挥工人按顺序造房
public Product create(Builder builder) {
builder.bulidA();
builder.bulidB();
builder.bulidC();
builder.bulidD();
return builder.getProduct();
}
} -
调用
public class Click {
public static void main(String[] args) {
showBike(new OfoBuilder());
showBike(new MobikeBuilder());
}
private void showBike(Builder builder) {
Director director = new Director(builder);
Bike bike = director.construct();
bike.getFrame().frame();
bike.getSeat().seat();
bike.getTire().tire();
}
}
二、第二种方式 -
房子对象
public class Product {
private String buildA;//打地基
private String buildB;//垒砖造房子
private String buildC;//装修墙面
private String buildD;//验收房子
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+“房子验收完成”;
}
} -
建造者
abstract class Builder {
//地基
abstract void bulidA();
//钢筋工程
abstract void bulidB();
//铺电线
abstract void bulidC();
//粉刷
abstract void bulidD();
//完工-获取产品
abstract Product getProduct();
} -
具体建造者(工人)
public class ConcreteBuilder extends Builder{
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
void bulidA(String mes) {
product.setBuildA(mes) );
}
@Override
void bulidB(String mes) {
product.setBuildB(mes) );
}
@Override
void bulidC(String mes) {
product.setBuildC(mes) );
}
@Override
void bulidD(String mes) {
product.setBuildD(mes) );
}
@Override
Product getProduct() {
return product;
}
} -
调用
public static void main(String[] args) {
ConcreteBuilder concreteBuilder = new ConcreteBuilder();
Product build = concreteBuilder
.bulidA(“打地基”)
.bulidB(“验收房子”)
.bulidC(“垒砖造房子”)
.bulidD(“装修墙面”)
.build();
System.out.println(build.toString());
}
三、建造者模式与抽象工厂模式的比较
如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车