温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-29 07:22:02 来源:网络 阅读:834 作者:东风玖哥 栏目:移动开发

什么是建造者模式

 

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

 

建造者模式的实现方式

 

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

先写一个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对象,是典型的用运行效率换开发进度的设计模式


本系列其他博客

 


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


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


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


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


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



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI