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

我的博客地址

建造者模式

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

建造者模式简介

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,237评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,710评论 18 399
  • #Android 基础知识点总结 ---------- ##1.adb - android debug bridg...
    Mythqian阅读 8,963评论 2 11
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,924评论 0 17
  • 回忆小姐今天聚餐,吃完饭就去唱歌,十一二点才回来。很久没有这么晚了,突然感觉自己又回到了之前上学的时候的感觉。打...
    睡丢一只袜子阅读 1,652评论 0 2

友情链接更多精彩内容