建造者模式
主要参考了 /冰鉴/ 的一篇博客,觉得写的很详细,然后自己敲了一遍。学习了 设计模式之建造者模式, 并做了一些笔记。
建造者模式简介
建造者模式(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();
最后还是很感谢 大神的文章,本篇文章作为个人笔记,有点局限,易于理解,方便事后查看。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦