定义:将一个复杂对象的构造与它的表示分离(ConcreteBuilder 负责表示,Director负责构建),使同样的构建过程(Director可以构建不同的对象)可以创建不同的表示,这样的设计模式被称为建造者模式。(常与模板模式一起使用)
使用场景: 1、当对象的构建过程十分复杂,需要与表示分离的时候。
2、当对象的表示有不同种类,需要加以区分的时候
优点:1.可以很方便构建的对象
2.对象的构造统一在一起构造,客户不关注构造过程。
3.更加方便的替换和新增产品,不用修改原代码(只需要提供对象内容)。
缺点:1.不适合创建差异性很大的产品类。
2.需要生成的产品对象有复杂的内部结构,这些产品对象具备共性。
类图:
结构
product需要的复杂对象
public class Product
{
private String A; //可以是任意类型
private String B;
private String C;
private String D;
//get set方法
}
Builder类
public abstract class Builder
{
protected Product product=new Product();
public abstract void buildA();
public abstract void buildB();
public abstract void buildC();
public Product getResult()
{
return product;
}
}
ConcreteBuilder 类
public class ConcreteBuilder extends Builder{
public void buildPartA(){
...
}
public void buildPartB(){
...
}
public void buildPartC(){
...
}
}
指挥者类
public class Director
{
private Builder builder;
//1 构造方法的方式注入builder对象
public Director(Builder builder)
{
this.builder=builder;
}
//2 set方法注入builder对象
public void setBuilder(Builder builder)
{
this.builder=builer;
}
public Product construct()
{
//将存在的ConcreteBuilder 直接组装
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
具体栗子
要构建的具体对象
public class Person{
//上衣
private String jacket;
//下装
private String bottling;
//戒子
private String ring;
//武器
private String arms;
//手镯
private String bracelet;
//鞋
private String shoes;
//get set方法
}
Builder类(一个抽象构造者,个人理解 需要一个抽象类实现多态的固定写法 应该也可以为接口 但是需要在每个实现类中增加共同的方法)
public abstract class PersonBuilder {
Person person= new Person();
public abstract void buildJacket();
public abstract void buildBottling();
public abstract void buildRing();
public abstract void buildArms();
public abstract void buildBracelet();
public abstract void buildShoes();
public Person getPerson(){
return person;
}
}
ConcreteBuilder类(现有的对象模型的种类)
public class ChargeMoney extends Person{
public void buildJacket(){
person.setJacket("金光闪闪上衣");
};
public void buildBottling(){
person.setBottling("亮瞎眼的裤子");
};
public void buildRing(){
person.setRing("钛合金戒子");
};
public void buildArms(){
person.setArms("40米长大砍刀");
};
public void buildBracelet(){
person.setArms("金溜子");
};
public void buildShoes(){
person.setShoes("大头皮鞋");
};
}
public class NoChargeMoney extends Person{
public void buildJacket(){
person.setJacket("花式囚衣");
};
public void buildBottling(){
person.setBottling("三角裤头");
};
public void buildRing(){
person.setRing("草戒子");
};
public void buildArms(){
person.setArms("牙签");
};
public void buildBracelet(){
person.setArms("柳树条");
};
public void buildShoes(){
person.setShoes("10块钱三双拖鞋");
};
}
Director(对类构造的整体控制,同时对客户隔绝)
public class GameGM{
private PersonBuilder personBuilder ;
public GameGM(PersonBuilder personBuilder ) {
this.personBuilder = personBuilder ;
}
public Person construct(){
//进行构造
personBuilder.buildJacket();
personBuilder.buildBottling();
personBuilder.buildRing();
personBuilder.buildArms();
personBuilder.buildBracelet();
personBuilder.buildShoes();
//准备完毕,返回一个人员模型
return personBuilder.getPerson();
}
}
客户调用
public class Test {
public static void main(String[] args) {
//即可获取到对象
ChargeMoney a = new ChargeMoney();
GameGM gm = new GameGM(a);
Meal mealA = gm.construct();
}
}