设计模式之建造者模式学习笔记

  |     |   本文总阅读量:

我的博客地址

建造者模式

主要参考了 /冰鉴/ 的一篇博客,觉得写的很详细,然后自己敲了一遍。学习了 设计模式之建造者模式, 并做了一些笔记。

建造者模式简介

建造者模式(Buidler Pattern)又叫生成器模式, 将一个复杂对象的构建和它的表示分离开,使得同样的构建过程可以创建不同的表示。

建造者模式有点

  1. 封装性:不必知道实现的细节,直接得到产品
  2. 扩展性:Builder类相互独立,方便以后扩展
  3. 安全性:每个产品相互独立,建造的过程不会对其他产生影响

建造模式步骤以及实现

  1. 创建产品类,是所有产品的父类。可以产生一个或多个产品,但是实现的接口可以完全不相关。

       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;
        }
    }
    
  2. 由父类生成两个子产品
    ###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();
        }
    }
    
  3. 创建接口,其中声明生产产品需要的方法

    public interface PersonBuilder {
        void buildName();   //制造姓名
        void buildAge();    //制造年龄
        void buildSex();    //制造性别
    
        Person getResult(); //返回产品
    }
    
  4. 创建具体的建造类,开始生产产品啦…
    ###制造学生

    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;
        }
    }
    
  5. 创建导演类,将制造过程放进去

    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();
        }
    }
    
  6. 最后进行测试,看能不能创建成功

    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();

最后还是很感谢 大神的文章,本篇文章作为个人笔记,有点局限,易于理解,方便事后查看。

#rewardButton { background-color: #ea6f5a; } .btn-pay { margin-bottom: 20px; padding: 8px 25px; font-size: 16px; color: #fff; background-color: #ea6f5a; } .btn { display: inline-block; margin-bottom: 0; font-weight: 400; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 14px; line-height: 1.42857; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #QR img{ height: 200px; height: 200px; margin: 20px; }
文章目录
  1. 1. 建造者模式
    1. 1.0.1. 建造者模式简介
    2. 1.0.2. 建造者模式有点
  2. 1.1. 建造模式步骤以及实现
您是第 位小伙伴 | 本站总访问量 | 已经写了 120.4k 字啦

载入天数...载入时分秒...