一、什么是建造者模式?
1、定义
建造者模式:将一复杂对象的表示与构建相分离,使得同样的构建过程可创建不同的显示。
2、 与抽象工厂的区别
在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
3、举例
建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
举个简单的例子,如 人的身体各部位,人的生命周期,一年四季,汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。
二、建造者模式UML
三、JAVA代码实现
Builder.java
package com.amosli.dp.build.builder;public abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getResult() ;}
ConcreteBuilder.java
package com.amosli.dp.build.builder;public class ConcreteBuilder extends Builder { private Product product = new Product(); public Product getResult() { return product; } @Override public void buildPartA() { product.add("part a.."); } @Override public void buildPartB() { product.add("part b.."); }}
Director.java
package com.amosli.dp.build.builder;public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct() { builder.buildPartA(); builder.buildPartB(); }}
Product.java
package com.amosli.dp.build.builder;import java.util.ArrayList;public class Product { ArrayListproduct = new ArrayList (); public void add(String part) { product.add(part); }}
Client.java
package com.amosli.dp.build.builder;public class Client { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); Product product = builder.getResult(); System.out.println(product.product); }}
四、使用场景
相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。
五、优点缺点
1.优点
封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节
易扩展
建造者独立,不同builder,可以构建成不同的显示,相互独立,提高了程序的可扩展性
便于控制细节风险
由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响
2.缺点
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,可维护性将变差
本系列文章源码地址, 欢迎Fork & Star !!