建造者模式
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,可以选择使用建造者模式。比如,你要画一个人,你需要先画头、身体、两手、两脚。这些是固定的流程,而具体的胖人、瘦人,这些就是不同的表示意图。这是就可以使用建造者模式固定建造流程,具体实现交由子类去实现。如果我们使用了建造模式,用户就只需指定需要建造的类型就可以得到它们,而具体的建造细节就不用知道了。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(即具体对象)。
建造者模式结构图:
建造者模式结构图代码解析:
//Product产品类,由多个部件组成
class Product{
List<String> parts = new ArrayList<>();
public void add(String part){
parts.add(part);
}
public void show(){
for(String part: parts){
println(part);
}
}
}
//Builder类:确定产品由两个部件组成
abstract class Builder{
public abstract void buildPartA();
public abstract void buildPartB();
//返回建造的产品
public abstract Product GetResult();
}
//具体的建造者类:ConcreteBuilder1
class ConcreteBuilder1 extends Buidler{
private Product product = new Product();
public void buildPartA(){
product.add("部件A")
}
public void buildPartB(){
product.add("部件B")
}
//返回建造的产品
public Product getResult(){
return product;
}
}
//具体的建造者类:ConcreteBuilder2
class ConcreteBuilder2 extends Buidler{
private Product product = new Product();
public void buildPartA(){
product.add("部件X")
}
public void buildPartB(){
product.add("部件Y")
}
//返回建造的产品
public Product getResult(){
return product;
}
}
//指挥者类,用来指定具体的建造过程
class Director{
public void Construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
///客户端类
class Main{
public static void main(String[] args){
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//构建b1类型产品,比如瘦人
director.Construct(b1);
Product p1 = b1.getResult();
p1.show();
//构建b2类型产品,比如胖人
director.Construct(b2);
Product p2 = b2.getResult();
p2.show();
}
}
也就是说,建造者模式用于:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。