定义
- 复杂对象的构建与它的表示分离,
- 使得同样的构建过程可以创建不同的表示.
- 用户不知道内部的具体构建细节
为何使用
使用
- 建立一个产品类
- 建立一个建造者接口,里面是组件各个部件的方法
- 实现具体的建造方案即面向接口编程
- 指挥者选择建造者,并建造产品
import java.util.ArrayList;
import java.util.Arrays;
/**
* @author sun
* 建造者模式
*/
public class BuilderModel {
public static void main(String[] args) {
Builder b1=new concerteBuild1();
Director d=new Director();
d.construct(b1);
b1.printProduct();
}
}
class Director{
public void construct(Builder b){
b.buildA();
b.buildB();
}
}
class Product{
private ArrayList<String> products=new ArrayList<String>();
public void add(String aspect){
products.add(aspect);
}
@Override
public String toString() {
return Arrays.toString(products.toArray());
}
}
interface Builder{
public void buildA();
public void buildB();
public void printProduct();
}
class concerteBuild1 implements Builder{
private Product product=new Product();
public void buildA() {
product.add("A");
}
public void buildB() {
product.add("B");
}
public void printProduct() {
System.out.println(product);
}
}
class concerteBuild2 implements Builder{
private Product product=new Product();
public void buildA() {
product.add("X");
}
public void buildB() {
product.add("Y");
}
@Override
public void printProduct() {
System.out.println(product);
}
}
构建器builder
- 一个类参数很多 比如person有10个参数
- 在初始化person时传统的构造器需要传入10个参数
- 然而10个参数实际上的意义很难理解,不容易维护
- 使用构建器解决这种问题
public class TestBuilder {
private final String name;
private final int age;
private final String adress;
private final String call;
public static void main(String args){
TestBuilder build = new TestBuilder.builder("zhangsan", 10).adress("XXX").call("XXX").Build();
}
private TestBuilder(builder builder) {
name=builder.name;
age=builder.age;
adress=builder.adress;
call=builder.call;
}
public static class builder{
private String name="null";
private int age=-1;
private String adress=null;
private String call=null;
public builder(String name, int age) {
this.name=name;
this.age=age;
}
public builder adress(String adress){
this.adress=adress;
return this;
}
public builder call(String call){
this.call=call;
return this;
}
public TestBuilder Build(){
return new TestBuilder(this);
}
}
}