一)故事
变化是永恒的
二)定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(也叫生成器模式)
三)代码例子
共计五个类:1)抽象产品类;2)具体产品类(可多个);3)抽象建造者类;4)具体建造者类(可多个);5)导演类(用于封装Builder具体类);
1)抽象产品类
2)具体产品类(可多个)
3)抽象建造者类
4)具体建造者类(可多个)
5)导演类(用于封装Builder具体类)
场景使用例子:
四)优点
1)封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节。如例子中我们就不需要关心每个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
2)建造者独立,容易扩展
BenzBuilder和BMWBuilder是相互独立的,对系统的扩展非常有利。
3)便于控制细节风险
由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。
五)缺点
六)使用场景
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2)多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
4)在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用创建者模式封装该对象的过程,该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,,而要通过建造者模式柔化创建过程,本身已经违反设计的最初目标。
七)注意事项
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建者模式,这是注重点不同。
八)扩展
九)总结
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同,而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。
变化是永恒的
二)定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(也叫生成器模式)
三)代码例子
共计五个类:1)抽象产品类;2)具体产品类(可多个);3)抽象建造者类;4)具体建造者类(可多个);5)导演类(用于封装Builder具体类);
1)抽象产品类
/**
* 抽象产品类
*
* @author levovo
*/
public abstract class AbsProduct {
private ArrayList<String> sequence = new ArrayList<>();
// 产品类的公共方法
public void method1() {
System.out.println("AbsProduct()->method1()");
int len = sequence.size();
for (int n = 0; n < len; n++) {
System.out.println("AbsProduct()->method1():"+sequence.get(n));
}
}
// 抽象方法
public abstract void method2();
// 设置List
public void setPart(ArrayList<String> _sequence) {
this.sequence = _sequence;
}
}
2)具体产品类(可多个)
/**
* 具体产品类1
*
* @author levovo
*/
public class ConcreteProduct1 extends AbsProduct {
@Override
public void method2() {
// 业务逻辑处理
System.out.println("ConcreteProduct1()->method2()");
}
}
/**
* 具体产品类2
*
* @author levovo
*/
public class ConcreteProduct2 extends AbsProduct {
@Override
public void method2() {
// 业务逻辑处理
System.out.println("ConcreteProduct2()->method2()");
}
}
3)抽象建造者类
/**
* 抽象建造者类
*
* @author levovo
*/
public abstract class AbsBuilder {
// 设置产品的不同部分,以获得不同的产品
public abstract void setPart(ArrayList<String> sequence);
// 建造产品
public abstract AbsProduct buildProduct();
}
4)具体建造者类(可多个)
/**
* 具体建造者类1
*
* @author levovo
*/
public class ConcreteBuilder1 extends AbsBuilder {
private AbsProduct product = new ConcreteProduct1();
@Override
public void setPart(ArrayList<String> sequence) {
product.setPart(sequence);
}
@Override
public AbsProduct buildProduct() {
return product;
}
}
/**
* 具体建造者类2
*
* @author levovo
*/
public class ConcreteBuilder2 extends AbsBuilder {
private AbsProduct product = new ConcreteProduct2();
@Override
public void setPart(ArrayList<String> sequence) {
product.setPart(sequence);
}
@Override
public AbsProduct buildProduct() {
return product;
}
}
5)导演类(用于封装Builder具体类)
/**
* 导演类,用于封装Builder具体类
*
* @author levovo
*/
public class Director {
private ArrayList<String> sequence = new ArrayList<>();
private AbsBuilder builder1 = new ConcreteBuilder1();
private AbsBuilder builder2 = new ConcreteBuilder2();
// 建造产品1
public AbsProduct getConcreteProduct1() {
sequence.clear();
sequence.add("A");
sequence.add("B");
sequence.add("C");
builder1.setPart(sequence);
return builder1.buildProduct();
}
// 建造产品2
public AbsProduct getConcreteProduct2() {
sequence.clear();
sequence.add("C");
sequence.add("A");
sequence.add("B");
builder2.setPart(sequence);
return builder2.buildProduct();
}
}
场景使用例子:
/**
* 场景使用例子
*
* @author levovo
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
AbsProduct product1 = director.getConcreteProduct1();
product1.method1();
product1.method2();
AbsProduct product2 = director.getConcreteProduct2();
product2.method1();
product2.method2();
}
}
四)优点
1)封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节。如例子中我们就不需要关心每个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
2)建造者独立,容易扩展
BenzBuilder和BMWBuilder是相互独立的,对系统的扩展非常有利。
3)便于控制细节风险
由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。
五)缺点
六)使用场景
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2)多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
4)在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用创建者模式封装该对象的过程,该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,,而要通过建造者模式柔化创建过程,本身已经违反设计的最初目标。
七)注意事项
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建者模式,这是注重点不同。
八)扩展
九)总结
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同,而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。