建造者模式
主要参考了 /冰鉴/ 的一篇博客,觉得写的很详细,然后自己敲了一遍。学习了 设计模式之建造者模式, 并做了一些笔记。
建造者模式简介
建造者模式(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();
最后还是很感谢 大神的文章,本篇文章作为个人笔记,有点局限,易于理解,方便事后查看。