目录
1.建造者模式的概念
2.建造者模式的结构图
3.练习的例子
抽象的建造类:建造生产产品的抽象流程(建造产品的流程固定了,但是没有具体的实现)
/**
* 抽象的构建类
* 注意其构建的流程是固定的
*/
abstract class PersonBuilder {
public PersonBuilder(){}
/**
* 创建头部
*/
abstract void buildHead();
/**
* 创建身体
*/
abstract void buildBody();
/**
* 创建左胳膊
*/
abstract void buildArmLeft();
/**
* 创建右胳膊
*/
abstract void buildArmRight();
/**
* 创建左腿
*/
abstract void buildLegLeft();
/**
* 创建右腿
*/
abstract void buildLegRight();
}
肥胖的人的构建者:实现了固定流程的具体细节,可以理解成按照固定的流程创建了一条生产该具体产品的流水线
/**
* 肥胖的人的构建者
*
*/
public class PersonFatBuilder extends PersonBuilder{
@Override
void buildHead() {
System.out.println("造胖人的头");
}
@Override
void buildBody() {
System.out.println("造胖人的身体");
}
@Override
void buildArmLeft() {
System.out.println("造胖人的左胳膊");
}
@Override
void buildArmRight() {
System.out.println("造胖人的右胳膊");
}
@Override
void buildLegLeft() {
System.out.println("造胖人的左腿");
}
@Override
void buildLegRight() {
System.out.println("造胖人的右腿");
}
}
瘦人的构建者:
/**
* 瘦小的人构建者
*
*/
public class PersonThinBuilder extends PersonBuilder{
@Override
void buildHead() {
System.out.println("造瘦人的头");
}
@Override
void buildBody() {
System.out.println("造瘦人的身体");
}
@Override
void buildArmLeft() {
System.out.println("造瘦人的左胳膊");
}
@Override
void buildArmRight() {
System.out.println("造瘦人的右胳膊");
}
@Override
void buildLegLeft() {
System.out.println("造瘦人的左腿");
}
@Override
void buildLegRight() {
System.out.println("造瘦人的右腿");
}
}
构建产品的指挥者:把需要生产的具体产品的建造对象传进来,调用build方法理解为流水线开始干活,只有流水线开始干活了产品才能被建造出来
/**
* 构建产品的指挥者
*/
public class BuilderDirector {
private PersonBuilder personBuilder;
public BuilderDirector(PersonBuilder personBuilder){
this.personBuilder = personBuilder;
}
/**
* 开始构建
* 其实就是让产品的固定生产流程走一遍这样才能生产出产品
*/
public void build(){
personBuilder.buildHead();
personBuilder.buildBody();
personBuilder.buildArmRight();
personBuilder.buildArmLeft();
personBuilder.buildLegRight();
personBuilder.buildLegLeft();
}
}
客户端:
public class main {
public static void main(String[] args) {
PersonFatBuilder personFatBuilder = new PersonFatBuilder();
BuilderDirector builderDirector = new BuilderDirector(personFatBuilder);
builderDirector.build();
//瘦人同理
}
}
控制台:
4.总结
建造者模式是逐步建造产品的,所以建造者的Builder类(抽象构建类)里的那些建造方法必须要够普遍,以便为各种类型的具体建造者构造。
何时使用:建造者模式主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
ps:本人会把建造者模式与外观模式搞混,现对这两个模式进行总结
外观模式:
外观类会拿到多种子系统对象的引用,而且这些对象的初始化都是在外观类的内部进行的,在使用的时候,是各个子系统调用各自的方法,且只需要new一个外观对象就可以进行使用。
建造者模式:
建造指挥者会拿到一种具体建造者对象(生产具体产品的流水线)的引用,在使用的时候,该建造者是调用自己的一系列建造方法;而且建造者会在外面(客户端)new一条建造具体对象的生产线,然后传给指挥者,指挥者才能指挥流水线按流程进行工作。