建造者模式(Builder模式):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的优点
1、建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
2、建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
使用实例
先构建一个产品类
public class Product{
private String name;
private String size;
public void setName(String name){
this.name=name;
}
public void setSize(String size){
this.size=size;
}
}
然后创建一个抽象的Builder类
public abstract class Builder{
protected Product product;
public Product getProduct() {
return product;
}
public void createProduct() {
product = new Product();
System.out.println("a product is created");
}
public abstract void buildName();
public abstract void buildSize();
}
创建一个有具体实现的ConcreteBuilder类
public class ConcreteBuilder extends Builder {
public void buildName() {
product.setName("myProduct");
System.out.println("build product name");
}
public void buildSize() {
product.setSize("large");
System.out.println("build product size");
}
}
最后创建一个使用Builder的导演类
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
public void constructProduct(){
builder.createProduct();
builder.buildName();
builder.buildSize();
}
}
下面最终写个测试类
public class Test{
public static void main(String[] args){
Builder builder=new ConcreteBuilder();//创建一个具体实现的Builder实例
Director director=new Director(builder);//创建一个执行类
director.constructProduct();//创造产品
Product product=builder.getProduct();//得到产品
}
}
以上就是一个简单的建造者模式的例子。
建造者模式与工厂模式的区别
建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
总结
建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。