建造者模式
1.建造者模式含义
建造者模式含义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式可以理解为更加细致的工厂方法模式,工厂方法模式专注于生产对象实例的结果,而建造者模式更侧
重于生产对象实例的过程。
2.代码示例
建造者模式,通过含义的一段文字描述可能不太好理解,下面通过示例代码来讲解一下建造者模式
2.1Product类
public class Product {
// 产品生产所需的零件集合
private List<String> parts = new ArrayList<>();
public List<String> getParts() {
return parts;
}
public void setParts(List<String> parts) {
this.parts = parts;
}
// 产品生产方法
public void show(){
System.out.println("产品创建-----------");
for (String part : this.parts) {
System.out.println(part);
}
}
}
2.2Builder类
public abstract class Builder {
// 构建Product实例的A流程
public abstract void buildPartA();
// 构建Product实例的B流程
public abstract void buildPartB();
// 最终构建出Product实例结果的方法
public abstract Product getResult();
}
2.3ConcreteBuilder1类
public class ConcreteBuilder1 extends Builder{
// 实例化一个产品对象
private Product product = new Product();
// 这个产品生产的时候A工序业务逻辑
@Override
public void buildPartA() {
product.getParts().add("零件A");
}
// 这个产品生产的时候B工序业务逻辑
@Override
public void buildPartB() {
product.getParts().add("零件B");
}
@Override
public Product getResult() {
return product;
}
}
2.4ConcreteBulider2类
/**
* 建造者2生产产品的流程
*/
public class ConcreteBuilder2 extends Builder{
// 实例化一个产品对象
private Product product = new Product();
/**
* 这个产品生产的时候A工序业务逻辑
*/
@Override
public void buildPartA() {
product.getParts().add("零件X");
}
/**
* 这个产品生产的时候B工序业务逻辑
*/
@Override
public void buildPartB() {
product.getParts().add("零件Y");
}
@Override
public Product getResult() {
return product;
}
}
2.5Director类
/**
* 指挥者,指挥创建者以什么样的顺序生产product
*/
public class Director {
public void construct(Builder builder){
// 先执行A工序
builder.buildPartA();
// 再执行B工序
builder.buildPartB();
}
}
2.6测试类
public class MainApp {
public static void main(String[] args) {
// 实例化一个指挥者
Director director = new Director();
// 实例化两个建造者
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
// 指挥建造者1生产产品
director.construct(builder1);
Product product1 = builder1.getResult();
product1.show();
// 指挥建造者2生产产品
director.construct(builder2);
Product product2 = builder2.getResult();
product2.show();
}
}
运行结果
产品创建-----------
零件A
零件B
产品创建-----------
零件X
零件Y
2.7说明
Product类是我们需要具体生产的产品,而Product的生产需要Builder来完成。Builder生产Product的方式又分为两种ConcreteBuilder1和ConcreteBuilder2,这两个生产方式所用的零件不同。而Product的具体生产顺序又由Director来控制。
所以测试类中的产品生产顺序就是,先实例化一个Director对象,确定产品生产工序的顺序。然后再实例化两个不同的生产者,用不同的零件生产出Product。
3.建造者模式UML类图
4.总结
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用的。
简单点说就是,如果一个对象组成结构比较复杂,在创建的时候,需要根据客户端的需求,自定义改变这个对象的各个结构的组成顺序,组成原理等,这个时候就适合使用建造者模式了。
建造者模式跟工厂方法模式的区别在于,工厂方法是直接生产出对象的实例,并不关注对象生产的过程、顺序等,只关注对象生产的结果,并且生产出来的对象都是一样的。而建造者模式则是关注对象生产的过程、顺序等,当对象生产的过程顺序发生改变,最终生产出来的对象的结构就会变得不一样,这就是两者的区别。