将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
代码实现:
产品类:
package com.demo.builder.product;
public class Product {
public String component1; // 部件1
public String component2; // 部件2
public String component3; // 部件3
public String getComponent1() {
return component1;
}
public void setComponent1(String component1) {
this.component1 = component1;
}
public String getComponent2() {
return component2;
}
public void setComponent2(String component2) {
this.component2 = component2;
}
public String getComponent3() {
return component3;
}
public void setComponent3(String component3) {
this.component3 = component3;
}
public Product() {
}
public void show() {
System.out.println("component1 : " + component1);
System.out.println("component2 : " + component2);
System.out.println("component3 : " + component3);
}
}
建造者接口:
package com.demo.builder.builder;
import com.demo.builder.product.Product;
public interface IBulider {
public void buildComponent1(); // 建造部件1
public void buildComponent2(); // 建造部件2
public void buildComponent3(); // 建造部件3
public Product getProduct(); // 返回产品实例
}
抽象建造者:
package com.demo.builder.builder;
import com.demo.builder.product.Product;
public abstract class BaseBulider {
protected Product product;
public BaseBulider() {
this.product = new Product();
}
}
具体建造者:
package com.demo.builder.builder;
import com.demo.builder.product.Product;
public class BuilderImpl extends BaseBulider implements IBulider {
@Override
public void buildComponent1() {
product.setComponent1("component1");
}
@Override
public void buildComponent2() {
product.setComponent2("component2");
}
@Override
public void buildComponent3() {
product.setComponent3("component3");
}
@Override
public Product getProduct() {
return this.product;
}
}
指导者类:
package com.demo.builder.director;
import com.demo.builder.builder.IBulider;
import com.demo.builder.product.Product;
public class Director {
public Director() {
}
public Product createProduct(IBulider bulider) {
if (bulider != null) {
bulider.buildComponent1();
bulider.buildComponent2();
bulider.buildComponent3();
return bulider.getProduct();
}
return null;
}
}
测试代码:
package com.demo.builder;
import com.demo.builder.builder.BuilderImpl;
import com.demo.builder.builder.IBulider;
import com.demo.builder.director.Director;
import com.demo.builder.product.Product;
public class MainApp {
public static void main(String[] args) {
Director director = new Director();
IBulider bulider = new BuilderImpl();
Product product = director.createProduct(bulider);
product.show();
}
}
结果输出:
component1 : component1
component2 : component2
component3 : component3
建造者接口中有三个抽象方法分别实现了各个部件的构建,还有一个抽象方法返回产品实例,从而使得构造对象和获取对象分离。
指导者类的作用是封装了建造者构建产品的过程。
使用建造者模式的适用场合:
1) 当生成的产品对象内部具有复杂的结构时;
2) 当复杂对象需要与表示分离,可能需要创建不同的表示时;
3) 当需要向客户隐藏产品的内部结构的表现时。