如果我们创建一个实体类的时候,需要设置数据库环境,设置系统变量环境,设置用户自定义变量等多个步骤,可以在构造函数中去完成这些过程,但是如果把这些步骤全部都塞到一个构造函数中,有些不大好,比如有的子类可能只要其中的几个步骤,这样的话最理想的情况是这些设置步骤可选,怎么做呢,上代码了
/**
* 建造者设计模式
* 如果一个类的构建需要很多步骤,应该将步骤拆分开进行解耦
*/
public class Main {
public static void main(String[] args) {
//普通的建造者模式
AnimalDirector animalDirector = new AnimalDirector();
Animal animal1 = animalDirector.constructAnimal(new AnimalBuilder());
System.out.println(animal1);
//带链式操作的建造者模式
AnimalLinkDirector animalLinkDirector = new AnimalLinkDirector();
Animal animal2 = animalLinkDirector.constructAnimal(new AnimalLinkBuilder());
System.out.println(animal2);
}
}
public class Animal {
private String type;
private String color;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Animal{" +
"type='" + type + '\'' +
", color='" + color + '\'' +
'}';
}
}
public interface IAnimalBuilder {
void buildAnimal(String animal);
void buildColor(String color);
Animal buildAnimal();
}
public class AnimalBuilder implements IAnimalBuilder{
private Animal animal;
public AnimalBuilder(){
animal = new Animal();
}
@Override
public void buildAnimal(String animal) {
this.animal.setType(animal);
}
@Override
public void buildColor(String color) {
this.animal.setColor(color);
}
@Override
public Animal buildAnimal() {
return animal;
}
}
public class AnimalDirector {
public Animal constructAnimal(IAnimalBuilder animalBuilder) {
animalBuilder.buildAnimal("cat");
animalBuilder.buildColor("white");
return animalBuilder.buildAnimal();
}
}
public interface IAnimalLinkBuilder {
IAnimalLinkBuilder buildAnimal(String animal);
IAnimalLinkBuilder buildColor(String color);
Animal buildAnimal();
}
public class AnimalLinkBuilder implements IAnimalLinkBuilder{
private Animal animal;
public AnimalLinkBuilder(){
animal = new Animal();
}
@Override
public AnimalLinkBuilder buildAnimal(String animal) {
this.animal.setType(animal);
return this;
}
@Override
public AnimalLinkBuilder buildColor(String color) {
this.animal.setColor(color);
return this;
}
@Override
public Animal buildAnimal() {
return animal;
}
}
public class AnimalLinkDirector {
public Animal constructAnimal(IAnimalLinkBuilder animalLinkBuilder) {
/**
* 链式操作,返回的是this,这样操作直观简单
*/
return animalLinkBuilder.buildAnimal("dog").buildColor("black").buildAnimal();
}
}
用法:
以上的代码展示了两种建造者模式,其中有一种用到了链式操作,初学者很容易觉得这种链式操作挺神秘的,其实很容易,就是返回类的this对象而已,最典型的就是jquery中的链式操作,建造者模式可以看成是windows的设置向导,一步步完成了我们所需要的对象。