- 什么是建造者模式
- 建造者模式的例子
- 建造者模式的使用场景
- 建造者模式和工厂模式的比较
- 建造者模式优缺点
什么是建造者模式
我们大家都有过在KFC或者麦当劳点餐的经历,不管我们是点他们的套餐还是我们自己随心所欲的点我们需要的内容,对于他们的售货员来说都是没有什么区别的.他们都是根据我们我们要的食物放在一起然后递给我们.这也就是一个典型的建造者模式,建造者模式包含以下一个概念:
Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
Product:创建的目标;
UML
建造者模式的例子
建造器的接口
package com.designPattern.builder;
/**
* 建造模式的核心接口,规范建造的内容
*
* @author Jason
*
*/
public interface Builder {
// 建造模块A
public abstract void buildPartA();
// 建造模块B
public abstract void buildPartB();
// 得到产品
public abstract Product getProduct();
}
建造器的中间层(个人认为有的话比较好.)
package com.designPattern.builder;
/**
* 建造者模式的监管者,确定建造的顺序。(这一级有时也可以省略)
*
* @author Jason
*
*/
public abstract class AbstractBuilder implements Builder {
public Product product = new Product();// 建造的产品
public AbstractBuilder() {
this(null);
}
public AbstractBuilder(Product product) {
if (product != null) {
this.product = product;
}
}
// 为其提供默认的构建过程
public void build() {
buildPartA();
buildPartB();
}
// 得到产品
public Product getProduct() {
return product;
}
}
建造器的执行者
package com.designPattern.builder;
public class ConcreteBuilder extends AbstractBuilder {
public ConcreteBuilder() {
this(null);
}
public ConcreteBuilder(Product product) {
super(product);
}
@Override
public void buildPartA() {
System.out.println("建造产品" + product.getName() + "的A部分");
getProduct().setPartA("A");
}
@Override
public void buildPartB() {
System.out.println("建造产品" + product.getName() + "的B部分!");
getProduct().setPartA("B");
}
}
director,建造器的管理者
package com.designPattern.builder;
/**
* 建造者模式中的导演,发布建造的命令,确定建造顺序
*
* @author Jason
*
*/
public class Director {
Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
// 确定建造过程
public void build() throws Exception {
if (builder == null) {
throw new Exception("建造者不能为空!");
}
builder.buildPartA();
builder.buildPartB();
}
// 返回产品
public Product getProduct() {
if (builder != null) {
return builder.getProduct();
}
return null;
}
}
测试类
package com.designPattern.builder;
import org.junit.Test;
public class TestCase {
@Test
public void test() throws Exception {
Product product = new Product("A");
Builder builder = new ConcreteBuilder(product);
Director director = new Director(builder);
director.build();// 进行建造
director.getProduct();
}
}
建造者模式的使用场景
1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
建造者模式的优缺点
优点:
1.使用建造者模式可以使客户端不必知道产品内部组成的细节。
2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点:
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
建造者模式和工厂模式的比较
工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
可以比较两个模式的example代码,一比较就会比较出来,工厂模式关心整体,建造者模式关心细节。