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

字数 811阅读 149

我的博客地址

建造者模式

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

建造者模式简介

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

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

推荐阅读更多精彩内容