JAVA設計模式之Builder模式

1.1 Builder模式介紹

    Builder我在網上看了很多帖子但是並沒有詳細的講解 , 基本都是說使得構建過程和表示隔離開 , 其實你如果光看代碼的話我是不建議的 , 好了廢話不多說下面進入主題

1.2 Builder模式的定義

    將一個複雜對象的構造與它的表示分離(我理解是:說白了就是不在構造方法裏面設置參數 , 換一種體現形式 , 讓構建過程和部件都可以自由的擴展) , 使同樣的構造過程可以創建不同的表示,

1.3 Builder模式的簡單實現

我們平常寫個Javabean一般可能會這樣寫

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-27.
 */

public class Persion {

    private String name;
    private int age;
    private int height;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Persion{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

使用 : 

package com.example.liangshaoteng.imageloader;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.example.liangshaoteng.imageloader.bean.Builder;
import com.example.liangshaoteng.imageloader.bean.Director;
import com.example.liangshaoteng.imageloader.bean.MacBookBuilder;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Persion persion = new Persion();
        persion.setName("小明");
        persion.setAge(18);
        persion.setHeight(178);

        Toast.makeText(getApplicationContext(), "persion : " + persion.toString(), Toast.LENGTH_LONG).show();
    }
}

但是我們用的時候是不是感覺太麻煩了嗎


下面給大家介紹Builder形式

package com.example.liangshaoteng.imageloader;

/**
 * Created by liangshaoteng on 17-6-27.
 */

public class Persion {

    private String name;
    private int age;
    private int height;

    Persion(builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.height = builder.height;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Persion{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }


    static class builder {

        public String name;
        public int age;
        public int height;

        public builder name(String name) {
            this.name = name;
            return this;
        }

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

        public builder height(int height) {
            this.height = height;
            return this;
        }

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


使用 : 

package com.example.liangshaoteng.imageloader;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.example.liangshaoteng.imageloader.bean.Builder;
import com.example.liangshaoteng.imageloader.bean.Director;
import com.example.liangshaoteng.imageloader.bean.MacBookBuilder;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Persion.builder builder = new Persion.builder();
        Persion persion = builder
                .name("小明")
                .age(18)
                .height(178)
                .build();

        Toast.makeText(getApplicationContext(), "persion : " + persion.toString(), Toast.LENGTH_LONG).show();
    }
}

可見各大框架中大量的運用了Builder模式。最後總結一下

  • 定義一個靜態內部類Builder,內部的成員變量和外部類一樣
  • Builder類通過一系列的方法用於成員變量的賦值,並返回當前對象本身(this)
  • Builder類提供一個build方法或者create方法用於創建對應的外部類,該方法內部調用了外部類的一個私有構造函數,該構造函數的參數就是內部類Builder
  • 外部類提供一個私有構造函數供內部類調用,在該構造函數中完成成員變量的賦值,取值爲Builder對象中對應的值

是不是看的簡單明瞭啊 , 一行代碼搞定!


其實有很多種表現形式 , 這個只是一個簡單的例子,比如 AlertDialog , OkHttp等等都是用了Builder 如果有不對的地方請大家指出謝謝 !

    

發佈了54 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章