Builder Pattern for Android
Builder pattern are very help-full when having model class, inside this model class having constructor with many parameters, which having some of them optional and some of them mandatory, by using builder-pattern, we will create chain of methods. The builder pattern is a good choice when designing classes whose constructors or static factories would have more than a hand-full parameters.
For example, if you observe in our in-build alert dialog, AlertDialog using builder class to build alert. Code is look like:
new AlertDialog.Builder(this)
.setTitle("Alert Dialog")
.setMessage("Alert message")
.setCancelable(false)
.create();
So our question will be when and why we will use builder pattern?
Assume we have a model class which having list of constructors like bellow:
Student(int id, String name){...........}
Student(int id, String name,String stream){...........}
Student(int id, String name,String stream,String historyMarks){...........}
Student(int id, String name,String stream,String historyMarks,String mathMarks){...........}
..
...
.....
.......
...........
The problem is with this once constructors are 5 or 6 long parameters long, it's really very difficult to remember every-time particular constructor we should use. The better solution is to use builder-pattern.
Now we will create a builder class for better understanding. Firstly create a model class with name BuilderPatternModel.
Inside this model class, we will define some variables as bellow:
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
Now we will not generate any getter and setter methods, we will create UserBuilder class inside BuilderPatternModel which is static. UserBuilder have the methods to build our object.
For example:
public static class UserBuilder{
private String fName;
private String lName;
private int ag;
private String ph;
private String addr;
public UserBuilder fName(String fName){
this.fName = fName;
return this;
}
public BuilderPatternModel build() {
BuilderPatternModel bModel = new BuilderPatternModel(this);
return bModel;
}
}
In this above example, having setter type method but having UserBuilder return type and at last having build() which returns BuilderPatternModel.
Now next important thing is:
Create a private constructor BuilderPatternModel look like bellow:
private BuilderPatternModel(UserBuilder ub){
this.firstName = ub.fName;
this.lastName = ub.lName;
this.age = ub.ag;
this.phone = ub.ph;
this.address = ub.addr;
}
This constructor setting value and making it private so it can't access from out side.
BuilderPatternModel class looking like bellow:
public class BuilderPatternModel {
private String firstName;
private String lastName;
private int age;
private String phone;
private String address;
private BuilderPatternModel(UserBuilder ub){
this.firstName = ub.fName;
this.lastName = ub.lName;
this.age = ub.ag;
this.phone = ub.ph;
this.address = ub.addr;
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}
public String getPhone(){
return phone;
}
public String getAddress(){
return address;
}
public static class UserBuilder {
private String fName;
private String lName;
private int ag;
private String ph;
private String addr;
public UserBuilder() {
}
public UserBuilder fName(String fName){
this.fName = fName;
return this;
}
public UserBuilder lName(String lName){
this.lName = lName;
return this;
}
public UserBuilder ag(int ag){
this.ag = ag;
return this;
}
public UserBuilder ph(String ph){
this.ph = ph;
return this;
}
public UserBuilder address(String address){
this.addr = address;
return this;
}
public BuilderPatternModel build() {
BuilderPatternModel bModel = new BuilderPatternModel(this);
return bModel;
}
}//End of User-Builder
}
How to use this model class for builder-pattern:
ArrayList<BuilderPatternModel> listModel = new ArrayList<>();
BuilderPatternModel m1 = new BuilderPatternModel.UserBuilder()
.fName("Fname1")
.lName("lName")
.ag(10)
.ph("123456")
.address("addresss")
.build();
BuilderPatternModel m2 = new BuilderPatternModel.UserBuilder()
.fName("Fname2")
.address("addresss")
.build();
listModel.add(m1);
listModel.add(m2);
How you can get the value:
for (int i = 0; i < listModel.size(); i++) {
Toast.makeText(getApplicationContext(), listModel.get(i).getFirstName() + " \n" + listModel.get(i).getLastName()
+ " \n" + listModel.get(i).getAge() + " \n" + listModel.get(i).getPhone() + " \n" + listModel.get(i).getAddress(), Toast.LENGTH_SHORT).show();
}
No comments:
Post a Comment