美文网首页
设计模式之建造者模式

设计模式之建造者模式

作者: AirLan | 来源:发表于2017-10-14 15:14 被阅读15次

写在前面

定义:在设计模式中对Builder模式的定义是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用场景:用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。

写法

一般我们创建一个含有少量成员变量类的含参构造方法的时候往往是下面这个样子的:

public class Person {  
    private int id;  
    private String name;  
    private int age;  
    public Person(int pid, String name, int age) {  
        this.id = pid;  
        this.name = name;  
        this.age = age;  
    }  
} 

但是当这个类的成员变量很多的时候,再使用这种方式势必会造成构造方法很繁重,这个时候使用构造者模式Builder可以很好的解决这个问题。在android源码以及很多第三方库中很多地方都使用到了构造者模式,例如:android中创建Dialog,
android中创建�Notification,OkHttp库,Retrofit库等。下面是OkHttp和Retrofit的构建对象的一个例子:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .build();

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.53iq.com/")
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient)
                .build();

十分的清晰可自由配置。那么怎么简单的实现这种模式呢?请看下面:
这里我通过宾馆的一个房间为例子,来进行说明。(一般宾馆一个房间里面是由有很多东西构成,例如:床,空调,电视,衣架,拖鞋,热水壶,茶杯,卫生间...等等。)

public class BedRoom {
    //床
    private String chuang;
    //空调
    private String kong_tiao;
    //电视
    private String dian_shi;
    //衣架
    private String yi_jia;
    //拖鞋
    private String tuo_xie;
    //热水壶
    private String re_shui_hu;
    //茶杯
    private String cha_bei;


    private BedRoom(Builder builder) {
        this.chuang = builder.chuang;
        this.kong_tiao = builder.kong_tiao;
        this.dian_shi = builder.dian_shi;
        this.yi_jia = builder.yi_jia;
        this.tuo_xie = builder.tuo_xie;
        this.re_shui_hu = builder.re_shui_hu;
        this.cha_bei = builder.cha_bei;
    }


    public static class Builder {
        //床
        private String chuang;
        //空调
        private String kong_tiao;
        //电视
        private String dian_shi;
        //衣架
        private String yi_jia;
        //拖鞋
        private String tuo_xie;
        //热水壶
        private String re_shui_hu;
        //茶杯
        private String cha_bei;

        public Builder setChuang(String chuang) {
            this.chuang = chuang;
            return this;
        }

        public Builder setKong_tiao(String kong_tiao) {
            this.kong_tiao = kong_tiao;
            return this;
        }

        public Builder setDian_shi(String dian_shi) {
            this.dian_shi = dian_shi;
            return this;
        }

        public Builder setYi_jia(String yi_jia) {
            this.yi_jia = yi_jia;
            return this;
        }

        public Builder setTuo_xie(String tuo_xie) {
            this.tuo_xie = tuo_xie;
            return this;
        }

        public Builder setRe_shui_hu(String re_shui_hu) {
            this.re_shui_hu = re_shui_hu;
            return this;
        }

        public Builder setCha_bei(String cha_bei) {
            this.cha_bei = cha_bei;
            return this;
        }

        public BedRoom build() {
            return new BedRoom(this);
        }
    }


    public String getChuang() {
        return chuang;
    }

    public String getKong_tiao() {
        return kong_tiao;
    }

    public String getDian_shi() {
        return dian_shi;
    }

    public String getYi_jia() {
        return yi_jia;
    }

    public String getTuo_xie() {
        return tuo_xie;
    }

    public String getRe_shui_hu() {
        return re_shui_hu;
    }

    public String getCha_bei() {
        return cha_bei;
    }

    @Override
    public String toString() {
        return "BedRoom{" +
                "chuang='" + chuang + '\'' +
                ", kong_tiao='" + kong_tiao + '\'' +
                ", dian_shi='" + dian_shi + '\'' +
                ", yi_jia='" + yi_jia + '\'' +
                ", tuo_xie='" + tuo_xie + '\'' +
                ", re_shui_hu='" + re_shui_hu + '\'' +
                ", cha_bei=" + cha_bei +
                '}';
    }
}

客户端调用

    public static void main(String[] args) {
        BedRoom bedRoom = new BedRoom.Builder()
                .setChuang("圆床")
                .setDian_shi("小米电视")
                .setKong_tiao("格力空调")
                .setYi_jia("衣架5个")
                .setRe_shui_hu("热水壶1个")
                .setCha_bei("茶杯2个")
                .setTuo_xie("拖鞋2双")
                .build();
        System.out.println(bedRoom);        
    }

运行结果:

BedRoom{chuang='圆床', kong_tiao='格力空调', dian_shi='小米电视', yi_jia='衣架5个', tuo_xie='拖鞋2双', re_shui_hu='热水壶1个', cha_bei=茶杯2个}

总结

构造者模式,一般主要是通过实现一个Builder静态内部类,然后Builder中添加与外部类同样的成员变量,为各个成员变量写set方法同时返回这个对象本身即return this,最后适用build()方法构建一个外部类的实例,然后将自身的成员变量的值赋值到这个外部类。当然写法不只是这一种,这里只是一种最常见的写法,如有错误希望大家指正谢谢。

相关文章

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 设计模式之建造者模式

    设计模式之建造者模式 1. 模式定义 建造者模式又可以成为生成器模式,它属于对象创建型模式。建造者模式将一个复杂对...

  • Javaの设计模式之建造者模式

    推荐阅读:《设计模式之禅》 今早早起,刚刚出炉,哈哈 BuilderPattern 设计模式之建造者模式 Demo...

  • 设计模式之建造者模式

    设计模式之建造者模式 建造者模式 属于 创建型模式,提供一种创建对象的最佳方式。 创建型模式 指不是直接使用ne...

  • Retrofit

    Retrofit设计模式 动态代理,装饰模式,建造者模式,抽象工厂模式,适配器模式 建造者模式创建Retrofit...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • java设计模式--建造者模式

    java设计模式--建造者模式 建造者模式定义 建造者模式:是将复杂对象的构建与表示进行分离,使同样的构建过程会有...

  • 【Java设计模式】--建造者模式

    建造者模式(Bulider模式) 一、什么是建造者模式 建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示...

  • 建造者设计模式-Builder design pattern

    建造者设计模式是创建型设计模式的一种。创建型设计模式处理对象创建的问题。 建造者设计模式,用来构建需要经过若干个建...

网友评论

      本文标题:设计模式之建造者模式

      本文链接:https://www.haomeiwen.com/subject/zigxuxtx.html