一、什么是建造者模式?
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 {
ArrayList<String> product = new ArrayList<String>();
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.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,可维护性将变差
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!