手记

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

我的博客地址

建造者模式

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

建造者模式简介

建造者模式(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();

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

0人推荐
随时随地看视频
慕课网APP