建造者模式是将复杂对象的构建和表示进行分离,让同样的构建过程可以创建出不同的表示。
比如,一个人的类,有三个属性:头、身体和脚。
我们通过建造者模式将构建三个身体部位的动作分离开,那么,对这三个身体部位有任意一个部位构造方法不同,都会表示出不同的人来,这就是所谓的对负责对象的构建和表示进行分离的思想。
在建造者模式下,有四个角色:product(产品类,以上的例子指的是人这个类)、抽象建造者、建造者和导演类。功能如下:
- 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
- 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
代码实现:
Product:
public class Person { private String head; private String body; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
Builder:
public interface PersonBuilder { void buildHead(); void buildBody(); void buildFoot(); Person buildPerson(); }
//具体建造工具
ConcreteBuilder
public class ManBuilder implements PersonBuilder { Person person; public ManBuilder() { person = new Person(); } public void buildbody() { person.setBody("建造男人的身体"); } public void buildFoot() { person.setFoot("建造男人的脚"); } public void buildHead() { person.setHead("建造男人的头"); } public Person buildPerson() { return person; } }
导演类
Director
public class PersonDirector { public Person constructPerson(PersonBuilder pb) { pb.buildHead(); pb.buildBody(); pb.buildFoot(); return pb.buildPerson(); } }
测试:
public class Test{ public static void main(String[] args) { PersonDirector pd = new PersonDirector(); Person person = pd.constructPerson(new ManBuilder()); System.out.println(person.getBody()); System.out.println(person.getFoot()); System.out.println(person.getHead()); } }
运行结果:
建造男人的身体 建造男人的脚 建造男人的头