建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。建造者模式是一种对象建立型模式。git
建造者模式一步一步建立一个复杂的对象,它容许用户只经过指定复杂对象的类型和内容就能够构建它们,用户不须要知道内部的具体构建细节。建造者模式结构如图所示:编程
在建造者模式结构图中包含以下几个角色:设计模式
Productide
public class Product { private String partA; private String partB; private String partC; public String getPartA() { return partA; } public void setPartA(String partA) { this.partA = partA; } public String getPartB() { return partB; } public void setPartB(String partB) { this.partB = partB; } public String getPartC() { return partC; } public void setPartC(String partC) { this.partC = partC; } @Override public String toString() { return "Product{" + "partA='" + partA + '\'' + ", partB='" + partB + '\'' + ", partC='" + partC + '\'' + '}'; } }
Builder函数
public abstract class Builder { protected Product product = new Product(); public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); public Product getResult() { return product; } }
ConcreteBuilderui
public class ConcreteBuilder extends Builder { @Override public void buildPartA() { product.setPartA("hahaA"); } @Override public void buildPartB() { product.setPartB("hahaB"); } @Override public void buildPartC() { product.setPartC("hahaC"); } }
Directorthis
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public Product construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); return builder.getResult(); } }
Test设计
public class Test { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); Product product = director.construct(); System.out.println(product); } } //Product{partA='hahaA', partB='hahaB', partC='hahaC'}
在建造者模式中,客户端只需实例化指挥者类,指挥者类针对抽象建造者编程,客户端根据须要传入具体的建造者类型(可根据配置文件得到),指挥者将指导具体建造者一步一步构造一个完整的产品(逐步调用具体建造者的buildX()方法),相同的构造过程能够建立彻底不一样的产品。在游戏角色实例中,若是须要更换角色,只须要修改配置文件,更换具体角色建造者类便可;若是须要增长新角色,能够增长一个新的具体角色建造者类做为抽象角色建造者的子类,再修改配置文件便可,原有代码无须修改,彻底符合“开闭原则”。code
1 省略Director,直接将Director
中的construct
方法放入Builer
中
public abstract class Builder { protected Product product = new Product(); public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); public Product createProduct() { return product; } public Product construct() { this.buildPartA(); this.buildPartB(); this.buildPartC(); return product; } } ... Builder builder = new ConcreteBuilder(); Product product=builder.construct(); ...
2 添加钩子方法来控制是否对某个buildX()进行调用
抽象类中给一个默认的钩子方法
public abstract class Builder { protected Product product = new Product(); public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); public Product createProduct() { return product; } //钩子方法 public boolean isCNeed(){ return false; }
具体类中重写钩子方法
public class ConcreteBuilder extends Builder { ... @Override public boolean isCNeed() { return true; } }
控制器根据钩子方法来判断某一个buildX()是否执行
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public Product construct() { builder.buildPartA(); builder.buildPartB(); if(builder.isCNeed()){ builder.buildPartC(); } builder.buildPartC(); return builder.createProduct(); } }
将复杂对象的建立过程给封装了起来,同时将对象的建立过程与对象自己隔离开了,可以使用相同的建立过程来建立不一样的产品对象(提供不一样的Builder实现类便可)