Builder模式(建造者模式)是一种比较简单的设计模式,说到Builder模式,比较容易想到的就是AlertDialog.Builder,安卓中AlertDialog是可以通过Builder生成的,但是为什么需要使用Builder呢?下面对Builder模式做一个简单的介绍。
建造者模式也叫做生成器模式,其定义如下:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
在建造者模式中,一般有如下4个角色:
Product产品类:
通常是实现了模板方法模式,即拥有模板方法和基本方法,所谓基本方法即定义一些最基本的操作的具体实现的方法,比如AlertDialog中setTitle、setCancellable之类的方法,而模板方法可以理解为对基本方法的一个组装,一般在抽象类中具体实现而不需要在子类中复写。
Builder抽象建造者:
规范产品的构建,一般由子类具体实现,这部分仅仅是接口的抽象。
Builder具体建造者:
抽象建造者的子类,实现抽象建造者中的抽象方法,并且返回一个组建好的对象。
Director导演类:
负责安排已有模块的顺序,然后告诉Builder开始建造。
建造者模式的通用源码如下:
//产品类
public class Product(){
public void doSomething(){
//业务逻辑
}
}
//抽象建造者
public Interface IBuilder{
void setPart();
Product buildProduct();
}
//具体建造者
public class Builder implements IBuilder{
private Product product;
public void setPart(){
//业务逻辑
}
public Product buildProduct(){
return product;
}
}
//导演类
public class Director{
private IBuilder builder = new Builder();
public Product getProductA(){
builder.setPart();
return builder.buildProduct();
}
}
看过上面代码发现使用建造者模式有什么好处了吗?上面的例子,通过建造者模式,使得建造过程通过Director类的量产建造顺序固定的Product,即调用某一个具体建造者来批量的建造Product。
使用建造者模式,我们可以不在关注产品内部的实现细节,我们更多的关心组装流程,即setPart内的逻辑。而且每个具体建造者是相互独立的,这样对系统的扩展性就非常有利,如果需要创建一个新的类型的Product,我们之间添加一个Builder类即可,此外,由于具体建造者相互独立,所以我们可以将建造过程逐步细化,却不会对其他模块产生任何影响。
到这里不知道大家有没有这样的疑问,建造者模式和工厂模式非常相似啊,确实是非常的相似,但是两者还是存在一个很大的区别,建造者模式的最主要功能是基本方法的调用顺序安排,也就是说这些方法已经实现了,通俗的说就是零部件的组装,顺序不同,产生的对象也不同,然而工厂方法则重点在于创建,创建零件是他的主要职责,而组装并不是它所关心的。
下面总结下建造者模式的使用场景:
1. 相同的方法,不同的执行顺序会产生不同的事件结果时,可以采用建造者模式
2. 多个部件或者零件,都可以装配到一个对象,但是产生的运行结果却不同时,可以采用建造者模式
3. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效果,可以采用建造者模式
想到我们一开始提到的AlertDialog就属于产品类非常复杂,有很多属性需要设置,这时采用建造者模式就非常适合,而Android系统中也是在AlertDialog类中嵌入一个static class Builder,通过这个Builder,我们可以链式的生成dialog。