設計模式學習筆記----Builder模式

Builder模式的目的:
將一個複雜對象的構建和它的表示分離,使得同樣的構建過程可以創建不同的表示。

Builder模式的好處:
用戶可以通過該模式一步一步創建一個複雜對象,使得用戶可以在不知道內部構建細節的情況下,可以更精細的控制對象的構件流程。

目前Builder模式多分爲簡略版與經典版

簡略版:

public class Person {

    private final String name;          //屬性都被final修飾,不可變
    private final int age;
    private final String phone;

    private Person(PersionBuilder builder) {  //該bean類構造函數私有,使用者不可以直接調用來創建對象
        this.name = builder.name;
        this.age = builder.age;
        this.phone = builder.phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }



    public static class PersionBuilder {
        private final String name;
        private int age;
        private String phone;

        public PersionBuilder(String name) {   //Builder類的構造函數中限定了必須傳的屬性
            this.name = name;
        }

        public PersionBuilder age(int age) {
            this.age = age;
            return this;
        }

        public PersionBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

調用代碼如下:

Person person = new Person.PersionBuilder("小明")
                .age(12)
                .phone("13111111111")
                .build();

經典版:

Builder模式角色介紹:
Product 抽象的產品類
ConcreteProduct 具體的產品類,實現抽象類
Builder 抽象的生產者類,規範生產者功能
ConcreteBuilder 具體的生產者類,實現生產者的各個功能
Director 指揮類,負責指揮建造者進行建造組裝

抽象的產品類:

public abstract class Product {

    private String mName;
    private String mColor;

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

    public void setColor(String color){
        this.mColor = color;
    }

    public String getName(){
        return mName;
    }

    public String getColor() {
        return mColor;
    }

    public abstract String showInfoProduct();
}

具體的產品類:
這裏假設該具體產品多了一個Size的需求,得益於多態,可於這裏直接進行功能的擴展

public class ConcreteProduct extends Product {

    private int mSize;

    @Override
    public String showInfoProduct() {
        return "Name:" + getName() + " Color:" + getColor() + " " + " Size:" + getSize();
    }

    public void setSize(int size) {
        this.mSize = size;
    }

    public int getSize() {
        return mSize;
    }
}

抽象的生產者類

public abstract class Builder {
    public abstract void buildName(String name);
    public abstract void buildColor(String color);
    public abstract Product create();
}

具體的生產者類:
於該產品create時,直接指定了該產品的大小

public class ConcreteBuilder extends Builder {
    private ConcreteProduct mProduct = new ConcreteProduct();

    @Override
    public void buildName(String name) {
        mProduct.setName(name);
    }

    @Override
    public void buildColor(String color) {
        mProduct.setColor(color);
    }

    @Override
    public Product create() {
        mProduct.setSize(10);
        return mProduct;
    }
}

指揮類:
該類保證了不對外暴露任何生產細節,只需傳入參數,返回對應產品

public class Director {

    Builder mBuild=null;
    public Director(Builder build){
        this.mBuild=build;
    }
    public Product CreateProduct(String name, String color){
        //規範建造流程
        this.mBuild.buildName(name);
        this.mBuild.buildColor(color);
        return mBuild.create();
    }
}

調用方法:

 Builder mBuilder=new ConcreteBuilder();
        Director mDirecror=new Director(mBuilder);
        //組裝產品
        Product product = mDirecror.CreateProduct("X1","Red");

        Log.i("Builder","產品信息:"+product.showInfoProduct());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章