11.2设计模式-构建者模式-详解

构建者模式

    1. java的builder模式详解
    1. builder模式在android中的实际运用

1.java的builder模式详解

1.概念
    建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或不见)的复杂对象的创建过程分离
    :要创建的对象整体结构里有很多子对象,想把目标对象的创建和子对象的创建所分离,客户端不要知道复杂对象的内部组成部分与数据类型结构。
    建造者将关注点 集中到一步步创建复杂对象上,而不是将复杂对象拆开来每一步都去创建。
    这时不同的具体构建者,定义不同的创建过程。
    Okhttp,glid
    将一个复杂对象的构建与表示分离。怎么理解“表示”?
2.使用场景
    当构造一个对象需要很多参数的时候,并且参数的个数和类型不固定的时候。
    glid可以设置内存、sdk缓存
    
    
3.UML结构图分析
    图:
    类:Product(目标对象),Builder(抽象或者接口),ConcreteBuilder(具体的构建者实现) Director(方向、导演,组织构建循序等)
    Builder类:一般会申明BuildPartX方法。 getResult()返回已创建的复杂对象
    ConcreteBuilder类:实现了我们的Builder接口,实现了部件的具体创建方法,同时定义了创建复杂对象的作用,提供一个getResult方法
    Product类:内部不是单一变量,而是包含各种部件(x,y,z,重量,体积)
    Director 指挥者:负责整个结构,负责安排复杂对象的建造次序,安排好那些变量先初始化,以及变量直接有哪些关系
    
    客户端只需要使用Director完成交互
    图;
    public abstract class Builder{
        //创建产品对象
        protected Product product = new Product();
        public abstract void buildPartA();
        public abstract void buildPartB();
        public abstract void buildPartC();
        
        //返回产品对象
        public Product getResult(){
            return product;
        }
    }
    public class ConcreteBuilder extends Builder{
        public void buildPartA、B、C(){//去设置产品,不同的产品 }
    }
    
    class Product{
        private String partA、B、C;//定义部件,部件可以使任务类型,包括值类型和引用类型
        public String getPartA、B、C(){return xx};//这个部分用户不需要关心内部有多少复杂的类型。只需要做好Builder实现类的builderPartA的工作,
        public void setPartA、B、C(xx);
    }
    复杂对象就是包含多个属性的对象
    
    class Director{
        private Director(Builder builder){
            this.builder = builder;
        }
        
        public void setBuilder(Builder builder){
            this.builder = builder;
        }
        
        //产品构建与组装方法
        public Product construct(){
            builder.buildPartA();
            builder.buildPartB();
            builder.buildPartC();
            return builder.getResult();
        }
        作用:1.隔离我们程序员创建复杂对象的过程
                2.控制产品(Product)这个复杂对象的创建过程,是否需要执行某个方法,顺序怎样
        
    }
    
    使用:Builder builder = new ConcreteBuilder();//可通过配置文件实现
            Director director = new Director(builder);
            Product product = director.construct();
    
    总结:
        1.Builder:它为创建一个产品Product对象的各个部件指定抽象接口
        2.ConcreteBuilder:它实现了Builder接口,实现了各个部件的具体制造和装配方法
        3.Product:它是被构建的复杂对象,包含多个组成部件
        4.Director:指挥者又称导演类,它负责安排复杂对象的建造次序,指挥者和抽象建造者之间存在关联关系
4.实际代码分析
5.builder模式的优点
    松散耦合:生成器模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品构建和产品表现上的分离
    
    2.可以很容易的改变产品的内部表示
    3.更好的复用性:生成器模式很好的实现构建算法和具体产品实现的分离
    
    
6.builder模式的缺点
    1.会产生多余的Builder对象以及Director对象,消耗内存
    2.对象的构建过程暴露

2.builder模式在android中的实际运用

1.AlertDialog
2.Glide、OkHttp

1.AlertDialog
    图:
    AlertDialog :1.构造方法 2.onCreate方法 。属性:alert
        内部类:static class Builder{
                    AlertController.AlertParams P; 
                    方法:AlertDialog create(); 将AlertController与我们的AlertController.AlertParams建立联系。就是将控制成controller和逻辑层 params相联系
    AlertController:installContent(){
                        1.setContentView
                        2.setupView
                            整个视图构建的全过程
        内部类AlertController.AlertParams{
            方法:void apply(AlertController dialog){
                dialog.setTitle(mTitle);等等
2.Glide、OkHttp
11_1-11-7[00_28_03][20180731-203257-0].jpg
11_1-11-7[00_32_04][20180731-204203-1].jpg
11_1-11-7[00_33_05][20180731-204546-3].jpg
11_1-11-7[00_33_12][20180731-204539-2].jpg
11_1-11-7[00_35_12][20180731-205115-4].jpg
11_1-11-7[00_41_09][20180731-210541-5].jpg
11_1-11-7[00_42_11][20180731-210627-6].jpg
11_1-11-7[00_42_28][20180731-210640-7].jpg
11_1-11-7[00_42_55][20180731-210811-8].jpg
11_1-11-7[00_43_52][20180731-211046-9].jpg
11_1-11-7[00_44_10][20180731-211100-0].jpg
11_1-11-7[00_46_33][20180731-211438-1].jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,227评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,743评论 2 59
  • 这就是我们的百合。这是去年冬天买回来的,那时还是一个个花骨朵,过年的时候它们就开花了。 我发现了百合花的生长规...
    双子密码阅读 468评论 0 1
  • A:要在网格内开展行销工作,组成人员为渠道人员加自有员工,因为周五参加培训没办法组织行销工作,要求两位渠道经理牵头...
    玛奇朵_635b阅读 143评论 0 1
  • 十月初,刚去了位于山西晋城县北留镇皇城村的皇城相府,这里实际上是晋陕豫三地的交界处。皇城相府的主人,是帝师名相陈廷...
    尘封往事_be67阅读 282评论 1 1