建造者模式(Builder),将一个复杂对象的构造与他的表示分离,使得同样的构造过程可以创建不同的表示
如果你需要将一个复杂对象的构建于他的表示分离,使得构建过程可以创建不同的表示意图时,我们需要应用“建造者模式”,又叫“生成器模式”
适用性
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
3.用户创建一些复杂的对象,这些对象内部构建建的建造顺序通常的稳定的,但对象内部的构建通常面临着复杂的变化(比如画一个人)。
优点:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了
如果建造者模式,那么用户就只需要指定需要创建的类型就可以得到它们,而具体建造的过程和细节就不需知道了
Builder类:是为创建一个product对象的各个部件指定的抽象接口
ConcreteBuilder类:他是具体建造者,实现Builder接口,构造和装配各个部件
Director类:他是构建一个使用Builder接口的对象
public interface Builder { public void buildHead(); public void buildBody(); public void buildHand(); public void buildFoot(); public Person buildPerson(); } public class ManBuilder implements Builder{ Person person; public ManBuilder(){ person = new Man(); } @Override public void buildHead() { person.setHead("build man's head!"); } @Override public void buildBody() { person.setBody("build man's body!"); } @Override public void buildHand() { person.setHand("build man's hand!"); } @Override public void buildFoot() { person.setFoot("build man's food!"); } @Override public Person buildPerson() { return person; } } public class Person { private String head; private String hand; private String body; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } 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; } } public class PersonDirector { //指挥创建 public Person ConstructPerson(Builder b) { b.buildFoot(); b.buildHand(); b.buildHead(); b.buildBody(); return b.buildPerson(); } } public class Man extends Person{ } public class BuilderDemo { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here PersonDirector pd = new PersonDirector(); Person person = pd.ConstructPerson(new ManBuilder()); System.out.println(person.getHead()); System.out.println(person.getBody()); System.out.println(person.getHand()); System.out.println(person.getFoot()); } }