定義
- 複雜對象的構建與它的表示分離,
- 使得同樣的構建過程可以創建不同的表示.
- 用戶不知道內部的具體構建細節
爲何使用
使用
- 建立一個產品類
- 建立一個建造者接口,裏面是組件各個部件的方法
- 實現具體的建造方案即面向接口編程
- 指揮者選擇建造者,並建造產品
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);
}
}
}