1.定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.注意事项 :
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。
建造者模式和工厂方法模式非常相像,以下是它们之间的区别:
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的讲就是零件的装配,顺序不同产生的对象也不同;而工厂方法模式则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的 。
3.建造者模式的使用场景:
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
- 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。
4.通用代码:
package _5BuilderPattern;
// 产品类
public class Product {
public void doSomething1()
{
// 独立业务处理
}
public void doSomething2()
{
// 独立业务处理
}
}
package _5BuilderPattern;
// 抽象建造者
public interface Builder {
// 设置产品的不同部分(以不同的顺序调用产品方法)
public void setPart(Object obj);
// 建造产品
public Product buildProduct();
}
package _5BuilderPattern;
import java.util.List;
// 具体建造者
public class ProductBuilder implements Builder {
private Product product = new Product();
@SuppressWarnings("unchecked")
@Override
public void setPart(Object obj) {
// 这里方法的调用顺序不同,就产生了建造的产品不一样
// 该顺序可以在导演类(下面会介绍)中通过参数的形式的决定
List<String> methods = (List<String>)obj;
for (String methodString : methods)
{
if(methodString.equals("doSomething1"))
{
product.doSomething1();
}
else if(methodString.equals("doSomething2"))
{
product.doSomething2();
}
}
}
@Override
public Product buildProduct() {
return product;
}
}
package _5BuilderPattern;
import java.util.ArrayList;
import java.util.List;
// 导演类
public class Director {
private Builder builder = new ProductBuilder();
// 构建不同的产品
public Product getProduct()
{
List<String> methods = new ArrayList<String>();
methods.add("doSomething2");
methods.add("doSomething1");
builder.setPart(methods);
return builder.buildProduct();
}
}
此处使用了导演类,该类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式较庞大时,导演类可以有多个。
5.建造者模式的优点:
- 封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节
- 建造者独立,容易扩展
- 便于控制细节风险