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

我的博客地址

建造者模式

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

建造者模式简介

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

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