【设计模式与Android】建造者模式——建军大业

什么是建造者模式

成都创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十年时间我们累计服务了上千家以及全国政企客户,如成都资质代办等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞美。

 

所谓建造者模式,就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。建造者模式在构建过程中隐藏了复杂的实现细节,可以大大降低代码耦合度。

 

建造者模式的实现方式

 

《水浒传》讲述了的故事,梁山泊是一个不断壮大的队伍

先写一个Troops:

public abstract classTroops {

    protectedStringleader;
    protectedArrayListothers=newArrayList<>();
    protectedStringpurpose;

    //领袖
    public voidsetLeader(String leader) {
        this.leader= leader;
    }

    //其他人
    public voidsetOthers(String... others) {
        for(String other:others){
            this.others.add(other);
        }
    }

    //宗旨
    public abstract voidsetPurpose();


    @Override
    publicString toString() {
        return"Troops{"+
                "leader='"+leader+'\''+
                ", others="+others.toString() +
                ", purpose='"+purpose+'\''+
                '}';
    }
}

 

这是梁山的Troops:

public classLiangshanextendsTroops {

    protectedLiangshan(){}

    @Override
    public voidsetPurpose() {
        purpose="替天行道";
    }
}

 

再写一个Builder:

public abstract classBuilder {

    public abstract voidbuildLeader(String leader);

    public abstract voidbuildOthers(String... others);

    public abstract voidbuildPurpose();

    public abstractTroops create();

}

 

这是好汉们的Builder:

public classLiangshanBuilderextendsBuilder {

    privateLiangshanliangshan;

    @Override
    public voidbuildLeader(String leader) {
        liangshan.setLeader(leader);
    }

    @Override
    public voidbuildOthers(String... others) {
        liangshan.setOthers(others);
    }

    @Override
    public voidbuildPurpose() {
        liangshan.setPurpose();
    }

    @Override
    publicTroops create() {
        returnliangshan;
    }
}

 

接下来写一个Director:

public classDirector {

    BuildermBuilder=null;

    publicDirector(Builder builder){
        this.mBuilder= builder;
    }

    public voidconstruct(String leader,String... others){
        mBuilder.buildLeader(leader);
        mBuilder.buildOthers(others);
        mBuilder.buildPurpose();
    }

}

 

我们只需要如下代码便可以实现梁山好汉的大聚义:

Builder builder =newLiangshanBuilder();
Director director =newDirector(builder);
director.construct("宋江","卢俊义","吴用","公孙胜");
Log.e("梁山",builder.create().toString());

 

在实际开发过程中,Director层常常被省略,由一个链式调用的Builder来进行对象的组装。我们这次用梁山好汉的对立面——方腊来举例,这次这么改写上文的Builder:

public classMingjiaoBuilder{
    privateMingjiaomingjiao;

    publicMingjiaoBuilder(){
        mingjiao=newMingjiao();
    }

    publicMingjiaoBuilder buildLeader(String leader) {
        mingjiao.setLeader(leader);
        return this;
    }

    publicMingjiaoBuilder buildOthers(String... others) {
        mingjiao.setOthers(others);
        return this;
    }

    publicMingjiaoBuilder buildPurpose() {
        mingjiao.setPurpose();
        return this;
    }

    publicMingjiao create() {
        returnmingjiao;
    }
}

 

当然,Troops是这样继承的:

public classMingjiaoextendsTroops {
    @Override
    public voidsetPurpose() {
        this.purpose="作乱犯上";
    }
}

 

然后方腊作乱犯上的过程是这样的:

MingjiaoBuilder builder =newMingjiaoBuilder()
        //虽是妄称天子位
        .buildLeader("方腊")
        //也须伪列宰臣班
        .buildOthers("石宝","邓元觉","方杰")
        .buildPurpose();
Log.e("明教",builder.create().toString());

 

 

Android源码中的建造者模式

 

(1)AlertDialog.Builder

AlertDialog.Builder是Android源码中最常见的建造者模式,调用方式不再赘述。不过请注意这个建造者模式中并没有Director层的出现,因此这是一种简化的建造者模式。

 

Android开发中如何利用建造者模式

 

(1)建造者模式具备封装性良好的优点。在一个对象的初始化特别复杂、并且很多参数都有默认值时的优势非常明显。

 

(2)建造者模式还具备Builder独立、易于扩展的优点。可以在几个setter方法执行顺序不同时产生不同的结果。

 

需要注意的几个问题

 

(1)建造者模式会产生多余的Builder对象和Director对象,是典型的用运行效率换开发进度的设计模式

本系列其他博客

 

【设计模式与Android】原型模式——复制中心走出来的克隆人

【设计模式与Android】工厂方法模式——化工女神的工厂

【设计模式与Android】抽象工厂模式——嵌合体克隆工厂

【设计模式与Android】策略模式——锦囊里的上策中策下策

【设计模式与Android】状态模式——一个人的两幅面孔


当前文章:【设计模式与Android】建造者模式——建军大业
URL链接:http://pwwzsj.com/article/jdehgo.html