【設計模式二】建造者模式

定義:

將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

優點

建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在導演類中對整體而言可以取得比較好的穩定性。

其次,建造者模式很容易進行擴展。如果有新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,因此也就不會對原有功能引入風險。

建造者模式與工廠模式對比

建造者模式與工廠模式是極爲相似的,總體上,建造者模式僅僅只比工廠模式多了一個“導演類”的角色。
一般來說,如果產品的建造很複雜,那麼請用工廠模式;如果產品的建造更復雜,那麼請用建造者模式。

Product.java

public class Product {
    private String name;
    private String type;
    private String file;

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", file='" + file + '\'' +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setFile(String file) {
        this.file = file;
    }
}

Builder.java

 public interface Builder {
     void setPartA(String arg1, String arg2);
     void setPartB(String arg1,String arg2,String arg3);
     Product getProduct();
}

ConcreteBuilder.java

public class ConcreteBuilder implements Builder {

    Product product = new Product();

    @Override
    public void setPartA(String arg1, String arg2) {
        product.setName(arg1);
        product.setType(arg2);
    }

    @Override
    public void setPartB(String arg1, String arg2, String arg3) {
        product.setName(arg1);
        product.setType(arg2);
        product.setFile(arg3);
    }

    @Override
    public Product getProduct() {
        return product;
    }

}

Director.java

public class Director {
   Builder builder =   new ConcreteBuilder();
   public Product getAProduct(){
       builder.setPartA("寶馬","x1");
       return builder.getProduct();
   }
   public Product getBProduct(){
       builder.setPartB("寶馬","x2","zhangyu");
       return builder.getProduct();
   }
}

main.java

    public void main(){
        System.out.println("你好");

        Director director = new Director();
        Product aProduct = director.getAProduct();
        System.out.println(aProduct);

        Product bProduct = director.getBProduct();
        System.out.println(bProduct);

    }

測試結果

Product{name='寶馬', type='x1', file='null'}
Product{name='寶馬', type='x2', file='zhangyu'}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章