建造者模式:通常用于创建一些复杂的对象,这些对象内部构建间的构建顺序通常稳定,但是对象内部的构建通常面临着复杂的变化
优点:使得构建代码和表示代码分离,由于构建者隐藏了该产品是如何组装的,所以若要改变一个产品的内部表示,只需要再定义一个具体的构建者就可以了
实现:假设需要构建一个产品,需要两个零件,但是零件的构成范围很宽泛
1、产品类
/**
* 产品类
*/
public class Product {
//零件
List<String> list = new ArrayList<>();
public void add(String element){
list.add(element);
}
public void builderProduct(){
System.out.print("构建一个产品,它的构成部件有:");
for (String element : list){
System.out.print(element+" ");
}
System.out.println("");
}
}
2、建造类
/**
* 建造者抽象类(必须有两个零件)
*/
public abstract class Builder {
/**
* 零件一
*/
public abstract void elementOne();
/**
* 零件二
*/
public abstract void elementTwo();
/**
* 获取产品
*/
public abstract Product getProduct();
}
/**
* 建造者具体实现类1
*/
public class CreateBuilderOne extends Builder{
Product product = new Product();
public void elementOne(){
product.add("零件a");
}
public void elementTwo(){
product.add("零件b");
}
public Product getProduct(){
return product;
}
}
/**
* 建造者具体实现类2
*/
public class CreateBuilderTwo extends Builder{
Product product = new Product();
public void elementOne(){
product.add("零件x");
}
public void elementTwo(){
product.add("零件y");
}
public Product getProduct(){
return product;
}
}
3、指挥者
/**
* 指挥者
*/
public class Director {
public void construct(Builder builder){
builder.elementOne();
builder.elementTwo();
}
}
4、测试类
/**
* 测试建造者模式
*/
public class TestBuilder {
public static void main(String [] args){
Director director = new Director();
CreateBuilderOne one = new CreateBuilderOne();
CreateBuilderTwo two = new CreateBuilderTwo();
director.construct(two);
Product product = two.getProduct();
product.builderProduct();
}
}
测试结果:
建造者模式是当创建复杂对象的算法,应该独立与该对象的组成部分以及它的装配方式时需要用到的模式