1、源码里 Builder 模式实例
无论在Android SDK 还是各种开源的函数库,经常看到变种的 Builder 模式的应用。
例如Android 系统对话框AlertDialog 的使用,语句如下:
AlertDialog alertDialog = new AlertDialog.Builder(this).
setTitle("对话框标题").
setMessage("对话框内容").
setIcon(R.drawable.ic_launcher_background).
create();
alertDialog.show();
我们可以创建一个对象,并且对这个对象任意传递内部参数的个数,
而不是使用类似与构造函数,或者 set() get() 的方式。
例如:
Test(“标题”);
Test(“标题”,”“内容”);
test.set(“标题”);
test.set(“内容”);
以上两种方式在 对象 变量过多的时候使用 会比较繁琐。
所以我们这里创建一个类似于 Dialog 的builder 模式,我们比较方便的使用。
2、变种的 Builder 模式
我们以创建一个用户为例。
包含用户 名字 、 性别 、 年龄 、号码
1) 文件结构
User 是我们常用的 创建对象的类
MainActivity 是调用的地方
2) User 类 文件
package recognizerdemo.speech.baidu.com.mybuilder;
import android.util.Log;
public class User {
private String TAG = "User: ";
private final String mFirstName; //必选
private final String mLastName; //必选
private final String mGender; //可选
private final int mAge; //可选
private final String mPhoneNo; //可选
private User(UserBuilder builder) {
mFirstName = builder.firstName;
mLastName = builder.lastName;
mGender = builder.gender;
mAge = builder.age;
mPhoneNo = builder.phoneNo;
Log.i(TAG," build user");
}
public String getmFirstName() {
Log.i(TAG,"get firstName: " + mFirstName );
return mFirstName;
}
public String getmLastName() {
Log.i(TAG,"get lastName; " + mLastName);
return mLastName;
}
public String getmGender() {
Log.i(TAG,"get mGender: " + mGender);
return mGender;
}
public int getmAge() {
Log.i(TAG,"get mAge: " + mAge);
return mAge;
}
public String getmPhoneNo(){
Log.i(TAG,"get mPhoneNo: " + mPhoneNo);
return mPhoneNo;
}
public static class UserBuilder{
private String TAG = "UserBuilder; ";
private final String firstName;
private final String lastName;
private String gender;
private int age;
private String phoneNo;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
Log.i(TAG,"set name: " + firstName + " " + lastName);
}
public UserBuilder gender(String gender) {
this.gender = gender;
Log.i(TAG,"set gender: " + gender);
return this;
}
public UserBuilder age(int age) {
this.age = age;
Log.i(TAG,"set age: " + age);
return this;
}
public UserBuilder phone(String phone) {
this.phoneNo = phone;
Log.i(TAG,"set phone: " + phone);
return this;
}
public User build(){
Log.i(TAG,"set build");
return new User(this);
}
}
}
3)MainActivity 调用的地方
package recognizerdemo.speech.baidu.com.mybuilder;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
User userOne = new User.UserBuilder("lu","meng")
.gender("male")
.age(27)
.phone("1234567890")
.build();
userOne.getmFirstName();
userOne.getmLastName();
userOne.getmGender();
userOne.getmAge();
userOne.getmPhoneNo();
User userTwo = new User.UserBuilder("lu","lu")
.gender("Girl")
.age(25)
.phone("000000000")
.build();
userTwo.getmFirstName();
userTwo.getmLastName();
userTwo.getmGender();
userTwo.getmAge();
userTwo.getmPhoneNo();
}
protected void onResume(){
super.onResume();
}
}
3、log 打印
文献参考:
Android 高级进阶 顾浩鑫