码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-10-15 21:09:58      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:设计模式   android   

什么是建造者模式

 

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

 

建造者模式的实现方式

 

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

先写一个Troops:

public abstract class Troops {

    protected String leader;
    protected ArrayList<String> others = new ArrayList<>();
    protected String purpose;

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

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

    //宗旨
    public abstract void setPurpose();


    @Override
    public String toString() {
        return "Troops{" +
                "leader=‘" + leader + \‘+
                ", others=" + others.toString() +
                ", purpose=‘" + purpose + \‘+
                ‘}‘;
    }
}

 

这是梁山的Troops:

public class Liangshan extends Troops {

    protected Liangshan(){}

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

 

再写一个Builder:

public abstract class Builder {

    public abstract void buildLeader(String leader);

    public abstract void buildOthers(String... others);

    public abstract void buildPurpose();

    public abstract Troops create();

}

 

这是好汉们的Builder:

public class LiangshanBuilder extends Builder {

    private Liangshan liangshan;

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

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

    @Override
    public void buildPurpose() {
        liangshan.setPurpose();
    }

    @Override
    public Troops create() {
        return liangshan;
    }
}

 

接下来写一个Director:

public class Director {

    Builder mBuilder = null;

    public Director(Builder builder){
        this.mBuilder = builder;
    }

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

}

 

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

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

 

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

public class MingjiaoBuilder{
    private Mingjiao mingjiao;

    public MingjiaoBuilder(){
        mingjiao = new Mingjiao();
    }

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

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

    public MingjiaoBuilder buildPurpose() {
        mingjiao.setPurpose();
        return this;
    }

    public Mingjiao create() {
        return mingjiao;
    }
}

 

当然,Troops是这样继承的:

public class Mingjiao extends Troops {
    @Override
    public void setPurpose() {
        this.purpose = "作乱犯上";
    }
}

 

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

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

 

 

Android源码中的建造者模式

 

1)AlertDialog.Builder

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

 

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

 

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

 

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

 

需要注意的几个问题

 

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


本文出自 “玖哥的书房” 博客,请务必保留此出处http://dongfeng9ge.blog.51cto.com/9191243/1972481

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

标签:设计模式   android   

原文地址:http://dongfeng9ge.blog.51cto.com/9191243/1972481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!