建造者模式使用场景:将复杂的实现与应用进行分离。主要有四个类:产品类(Product)、建造抽象类(Builder)、建造实现类(ConcreteBuilder)、指挥者类(Director)。建造者模式仅仅只比工厂模式多了一个“指挥类”的角色。在建造者模式图中,假如把这个指挥类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥类。
产品类
package build; public class Product { private String food; private String water; public Product() { } public Product(String food, String water) { this.food = food; this.water = water; } public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getWater() { return water; } public void setWater(String water) { this.water = water; } }
抽象建造者类:这个类中有抽象的产品建造方法和抽象的产品返回方法
package build; public interface Builder { public void eat(); public void drink(); public Product getProduct(); }
具体建造者类
package build; public class ConcreteBuilder implements Builder{ Product product=new Product(); @Override public void eat() { product.setFood("面包"); } @Override public void drink() { product.setWater("依云矿泉水"); } @Override public Product getProduct() { return product; } }
指挥者类:构建一个使用Builder接口的对象, 负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
package build; public class Director { private Builder builder; //传入构建对象 public Director(Builder builder){ this.builder=builder; } //实现构建 public void construct(){ this.builder.eat(); this.builder.drink(); } }
客户端类测试
package build; public class Client { public static void main(String[] args) { //创建实例 Builder builder=new ConcreteBuilder(); //传入实例 Director director=new Director(builder); //构建 director.construct(); //获取产品 Product product=builder.getProduct(); //获取结果 System.out.println(product.getFood()); System.out.println(product.getWater()); } }
结果
面包 依云矿泉水