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 如果有不對的地方請大家指出謝謝 !