建造者模式
是什么?
建造者模式(Builder Pattern)是一种设计模式,又名:生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 ——维基百科
建造者模式的概念有点抽象…
先来简单介绍一下建造者模式中的几个角色概念
建造者模式中的几个角色
-
Product:表示被构造的复杂对象,这个比较好理解,就是需要构建的对象
-
Builder:为构建一个Product对象的各个部分指定抽象接口,面向接口编程嘛,提高代码可复用性(其实不用也行~)
-
ConcreteBuilder:具体的构造者实现类,负责具体化其对应产品各部分的构造细节(负责具体干活的)
-
Director:总监类,负责创建对象的各个部分的构造,但只涉及到构造顺序,并不涉及到具体的构造细节,这个人如其名,总监嘛,指挥就行,具体的脏活累活要交给手下做,手下就是具体的构造者实现类了
这么说还是比较抽象,下面写个简单的demo理解一下,看一下类图,有两种Product,所以对应的ConcreteBuilder也有两个
怎么用?
IProduct.java
/**
* 产品接口
*/
public interface IProduct {
void show();
}
ProductA.java
/**
* 产品A
*/
public class ProductA implements IProduct {
@Override
public void show() {
System.out.println("我是ProductA");
}
}
ProductB.java
/**
* 产品B
*/
public class ProductB implements IProduct {
@Override
public void show() {
System.out.println("我是ProductB");
}
}
IBuilder.java
/**
* Builder接口
*/
public interface IBuilder {
//公共构造步骤1/2/3
void doConstruct1();
void doConstruct2();
void doConstruct3();
//构造产品
IProduct build();
}
ProductABuilder.java
/**
* 产品A的Builder
*/
public class ProductABuilder implements IBuilder {
private IProduct IProduct = new ProductA();
@Override
public void doConstruct1() {
System.out.println("构造ProductA步骤1");
}
@Override
public void doConstruct2() {
System.out.println("构造ProductA步骤2");
}
@Override
public void doConstruct3() {
System.out.println("构造ProductA步骤3");
}
@Override
public IProduct build() {
return IProduct;
}
}
ProductBBuilder.java
/**
* 产品B的Builder
*/
public class ProductBBuilder implements IBuilder {
private IProduct product = new ProductB();
@Override
public void doConstruct1() {
System.out.println("构造ProductB步骤1");
}
@Override
public void doConstruct2() {
System.out.println("构造ProductB步骤2");
}
@Override
public void doConstruct3() {
System.out.println("构造ProductB步骤3");
}
@Override
public IProduct build() {
return product;
}
}
Director.java
/**
* 总监类,用于指挥构造过程
*/
public class Director {
private IBuilder IBuilder = null;
public Director(IBuilder builer) {
this.IBuilder = builer;
}
// 构造过程
public void construct() {
IBuilder.doConstruct1();
IBuilder.doConstruct2();
IBuilder.doConstruct3();
}
}
Test.java
/**
* 测试demo
*/
public class Test {
public static void main(String[] args) {
IBuilder builderA = new ProductABuilder();
Director director = new Director(builderA);
director.construct();
IProduct productA = builderA.build();
productA.show();
}
}
什么时候用?
-
产品类中的方法调用顺序不同会产生不同的结果。
-
初始化一个对象很复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
优缺点
优点:扩展性好,面向接口编程,一定程度上实现了解耦
缺点:应该比较明显了,每多一个产品就需要创建对应的Builder类,而且每次产品发生变化都需要需改Builder,比较麻烦