建造者模式:
需求:给定产品对象、建造对象、导演对象,使得产品对象通过建造对象与导演对象这两个对象的干预组合出客户最终所要的产品
其中建造对象与导演对象互不干预
设计方法:
首先设计出产品类,并构造其属性的getset方法
public class Product {
private String type;
private String name;
private List<String> list;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
再设计出建造者的抽象类,抽象类中一般包含产品建造部分和一个产品的返回
public abstract class Builder {
public abstract void setTopPart();
public abstract void setMiddlePart();
public abstract void setBottomPart();
public abstract Product getProduct();
}
设计具体的建造方案,使这些方案类继承抽象类,这样即可在建造完成产品后通过返回方法将产品返回
public class ConcreteBuilderA extends Builder {
private List<String> list = new ArrayList<String>();
private Product product = new Product();
@Override
public void setTopPart() {
// TODO Auto-generated method stub
product.setType("long");
}
@Override
public void setMiddlePart() {
// TODO Auto-generated method stub
product.setName("hair");
}
@Override
public void setBottomPart() {
// TODO Auto-generated method stub
list.add("I'm an artist");
product.setList(list);
}
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return product;
}
}
public class ConcreteBuilderB extends Builder {
private List<String> list = new ArrayList<String>();
private Product product = new Product();
@Override
public void setTopPart() {
// TODO Auto-generated method stub
product.setType("deep");
}
@Override
public void setMiddlePart() {
// TODO Auto-generated method stub
product.setName("dark");
}
@Override
public void setBottomPart() {
// TODO Auto-generated method stub
list.add("Fantasy");
list.add("That's good");
product.setList(list);
}
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return product;
}
}
设计导演类,创建一个私有的建造者对象,在定义的组装方法中选择想组装的部分,然后调用返回方法
对该建造者对象构造set方法
public class Directer {
private Builder builder;
public Product construct() {
builder.setTopPart();
builder.setBottomPart();
return builder.getProduct();
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
}
最后在客户端中,创建导演、建造方案实例,通过导演选择方案,由导演执行完方案后返回最终产品
public class Client {
public static void main(String[] args) {
Directer directer = new Directer();
Builder builderA = new ConcreteBuilderA();
directer.setBuilder(builderA);
Product product = directer.construct();
System.out.println(product.getList().get(0)+product.getName());
}
}
思考:
以上为建造者模式的基本思路,在实际应用中,产品对象、建造对象、导演对象均可以有多个
当产品对象的属性发生改变时,不一定要更改建造者的抽象类,可以重新设计一个建造方案类来继承建造者的抽象类
当建造者的抽象类中改变了普通方法或抽象方法的方法名时,导演类如果有对应的对象在调用时也需要更改
该模式在更改具体的建造方案的方法时,不需要对其他模块进行更改