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 如果有不对的地方请大家指出谢谢 !