建造器模式与工厂方法类似,不过侧重点不同。工厂方法模式主要目的的组装一个产品,强调产品的初始化和设置。而建造器模式强调的是产品各部件的组装顺序(即方法调用的顺序)。
产品类产品类可以使用模板方法模式。也可以不用。
/**
* 产品接口
*/
public abstract class Product {
// A 步骤
abstract public void stepA();
// B 步骤
abstract public void stepB();
}
/**
* X 产品
*/
public class ProductX extends Product {
public void stepA(){}
public void stepB(){}
public void doSomething(){}
}
/**
* Y产品
*/
public class ProductY extends Product {
public void stepA(){}
public void stepB(){}
public void doSomething(){}
}
建造类
有多少个产品,就可以对应多少个建造器实现类。注意两个建造实现类的setPart
方法内的组装顺序不同。
/**
* 建造器接口
*/
public abstract class Builder {
// 设置产品的不同部分,以获得不同的产品
public abstract void setPart();
// 建造产品
public abstract Product buildProduct();
}
/**
* X 建造器
*/
public class ConcreteBuilderX extends Builder {
private Product product = new ProductX();
@Override
public void setPart() {
product.stepA();
product.stepB();
}
@Override
public Product buildProduct() {
return product;
}
}
/**
* Y 建造器
*/
public class ConcreteBuilderY extends Builder {
private Product product = new ProductX();
@Override
public void setPart() {
product.stepB();
product.stepA();
}
@Override
public Product buildProduct() {
return product;
}
}
导演类
导演类的作用是使客户端不直接面向建造器类,降低系统的耦合性。一个导演类就足够了,里面管理着所有的建造器。
/**
* 导演类
*/
public class Director {
private Builder builderX = new ConcreteBuilderX();
private Builder builderY = new ConcreteBuilderY();
public Product getXProduct() {
builderX.setPart();
return (Product) builderX.buildProduct();
}
public Product getYProduct() {
builderY.setPart();
return (Product) builderY.buildProduct();
}
}