设计模式(4)--Builder 建造者(构建器)

来源:互联网 发布:拍电影特效软件 编辑:程序博客网 时间:2024/04/28 01:20

Builder和工厂模式一样,都是创建对象类型的模式。同样是创建类型的模式,其区别在于:Builder是应用于更为复杂的对象创建过程。举例说明:生产一辆玩具车,一个工厂一个方法就搞定了。而要生产一辆汽车,那部件太多了,部件不能少,且把所有这些部件组装在一起,也要有一套非常繁琐的流程和顺序。

这个时候,工厂模式中的工厂接口,就不是只写一个创建产品的抽象方法就够了。你必须考虑到使这个接口里具备一系列必不可少的方法,有了这些方法才能够满足生成完整产品的需要。而工厂实现类,必须实现接口中的一部分相关联的方法,才能创造出完整的产品(这一步很关键,工厂接口不能遗漏部件,要做到最普遍意义上的抽象,因为调用工厂时只使用接口类型去调用其中的方法。这在大话设计模式里,有一个很赞的说法:依赖倒转原则–抽象不应该依赖于细节,细节应该依赖于抽象)。同时,你还应该考虑创建一个类,专门来控制繁琐的流程,合理的调用工厂实现类中一系列方法生产出来的部件,拼出最终的产品。这就是Builder模式。

从这个意义上说,也不用太去纠结工厂和Builder的区别,还是那句话,理解精髓,使用时就水到渠成。如果你遇到复杂对象的创建,觉得应该封装,那就使用工厂。如果你发现对象极其复杂,那你就会觉得合理的方式是把每个部件的创建封装,并且应该制定规范保证不会遗漏部件。最后还需要一个总控类来负责完整产品的装配,你就自然的在使用Builder模式了。

Builder模式的要点:
这里写图片描述
1.上面所说的总控类,即Director,称之为导演类。导演类负责调用Builder提供的各类方法来完成最终的产品。
2.Builder,类似于工厂接口,称之为抽象建造者。这里是实现细节依赖抽象的核心。所有的Builder实现类,都必须实现Builder抽象出的一部分相关联的方法。才能实现完整的产品创建能力。
3.建造者,即Builder的实现类。相当于工厂模式的工厂实现类。同样是一种产品需要一个建造者。但要注意的是:

a.不同的产品可能要用各自不同的一系列方法去创建。很多例子里并没有强调这一点,但是GoF的举例中确实是有一个子类并没有实现全部Builder中的方法。
b.正因为a,所以Builder中未必都是抽象方法需要ConcretBuilder去实现,而也有可能是空方法,只有需要用到的那个ConcretBuilder去重写,但这依然是抽象的思维方式。

4.产品类,注意到产品并没有抽象成接口,这也不是定死的。因为在建造者模式中,很可能不同的产品实现根本就没有抽象出共性接口的可能。

至此总结一下:Builder模式就像是一个导演类,后面挂着一个工厂模式。当然这里的工厂很可能有一大堆创建方法,由导演类来负责总控和装配,从而实现对象的创建。所以,这是一个复杂对象适用的创建模式。

0 0
原创粉丝点击