建造者模式
主要参考了 /冰鉴/ 的一篇博客,觉得写的很详细,然后自己敲了一遍。学习了 设计模式之建造者模式, 并做了一些笔记。
建造者模式简介
建造者模式(Buidler Pattern)又叫生成器模式, 将一个复杂对象的构建和它的表示分离开,使得同样的构建过程可以创建不同的表示。
建造者模式有点
- 封装性:不必知道实现的细节,直接得到产品
- 扩展性:Builder类相互独立,方便以后扩展
- 安全性:每个产品相互独立,建造的过程不会对其他产生影响
建造模式步骤以及实现
-
创建产品类,是所有产品的父类。可以产生一个或多个产品,但是实现的接口可以完全不相关。
public class Person { private String name; //姓名 private int age; //年龄 private String work; //工作 public String getWork () { return work; } public void setWork (String work) { this.work = work; } 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; } }
-
由父类生成两个子产品
Student:
public class Student extends Person { private String sex = "man"; //性别 public Student () { this.setWork("student"); } public String getSex () { return sex; } public void setSex (String sex) { this.sex = sex; } @Override public String toString () { return "职业:\t" + this.getWork() + "\n性别:\t" + this.getSex() + "\n姓名:\t" + this.getName() + "\n年龄:\t" + this.getAge(); } }
Teather
public class Teatcher extends Person { private String sex; //性别 public Teatcher () { this.setWork("teacher"); } public String getSex () { return sex; } public void setSex (String sex) { this.sex = sex; } @Override public String toString () { return "职业:\t" + this.getWork() + "\n性别:\t" + this.getSex() + "\n姓名:\t" + this.getName() + "\n年龄:\t" + this.getAge(); } }
-
创建接口,其中声明生产产品需要的方法
public interface PersonBuilder { void buildName(); //制造姓名 void buildAge(); //制造年龄 void buildSex(); //制造性别 Person getResult(); //返回产品 }
-
创建具体的建造类,开始生产产品啦...
制造学生
public class StudentBuilder implements PersonBuilder { private Student stu = new Student(); @Override public void buildName () { stu.setName("a"); } @Override public void buildAge () { stu.setAge(12); } @Override public void buildSex () { stu.setSex("man"); } @Override public Person getResult () { return stu; } }
制造教师
public class TeatcherBuilder implements PersonBuilder { private Teatcher teatcher = new Teatcher(); @Override public void buildName () { teatcher.setName("b"); } @Override public void buildAge () { teatcher.setAge(23); } @Override public void buildSex () { teatcher.setSex("woman"); } @Override public Person getResult () { return teatcher; } }
-
创建导演类,将制造过程放进去
public class PersonDirector { private PersonBuilder builder; //制造学生 public Student constructStudent(){ builder = new StudentBuilder(); builder.buildAge(); builder.buildName(); builder.buildSex(); //产品生产完成,将产品返回出去 return (Student) builder.getResult(); } //制造老师 public Teatcher constructTeacher(){ builder = new TeatcherBuilder(); builder.buildAge(); builder.buildName(); builder.buildSex(); return (Teatcher) builder.getResult(); } }
-
最后进行测试,看能不能创建成功
PersonDirector director = new PersonDirector(); //生产学生 Student student = director.constructStudent(); Log.i(TAG, student.toString()); //生产老师 Teatcher teatcher = director.constructTeacher(); Log.i(TAG, teatcher.toString());
结果打印
01-04 14:10:31.907 2565-2565/xiaweizi.com.net I/MainActivity--->: 职业: student
性别: man
姓名: a
年龄: 12
01-04 14:10:31.907 2565-2565/xiaweizi.com.net I/MainActivity--->: 职业: teacher
性别: woman
姓名: b
年龄: 23
其实Dialog的链式使用可以采用建造者模式来完成
public class MyDialog {
//警告框标题
private String title;
//警告框图标资源ID
private int iconId;
//上线文
private Context context;
public String getTitle () {
return title;
}
public int getIconId () {
return iconId;
}
public Context getContext () {
return context;
}
public static class Builder{
//给自己的dialog设置默认内容
private String title = "title";
private int iconId = 0;
private Context context;
public Builder (Context context) {
this.context = context;
}
public Builder setTitle(String title){
this.title = title;
return this;
}
public Builder setIconId(int iconId){
this.iconId = iconId;
return this;
}
//应用自己的配置
private void applyConfig(MyDialog myDialog){
myDialog.title = title;
myDialog.iconId = iconId;
myDialog.context = context;
}
public MyDialog show(){
MyDialog myDialog = new MyDialog();
applyConfig(myDialog);
return myDialog;
}
}
}
#######使用就简单了
MyDialog myDialog =
new MyDialog.Builder(this).setTitle("标题").setIconId(R.mipmap.ic_launcher).show();
最后还是很感谢 大神的文章,本篇文章作为个人笔记,有点局限,易于理解,方便事后查看。