文章同步發(fā)放到CSDN博客
定義:
建造者模式:將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
實(shí)用范圍
1、當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
2、當(dāng)構(gòu)造過程必須允許被構(gòu)造的對(duì)象有不同表示時(shí)。
角色
在這樣的設(shè)計(jì)模式中,有以下幾個(gè)角色:
1、Builder:為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
2、ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并提供一個(gè)檢索產(chǎn)品的接口。
3、Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象,指導(dǎo)構(gòu)建過程。
4、Product:表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
角色Builder:
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
Person buildPerson();
}
角色ConcreteBuilder:
public class ManBuilder implements PersonBuilder {
Person person;
public ManBuilder() {
person = new Man();
}
public void buildbody() {
person.setBody("建造男人的身體");
}
public void buildFoot() {
person.setFoot("建造男人的腳");
}
public void buildHead() {
person.setHead("建造男人的頭");
}
public Person buildPerson() {
return person;
}
}
角色ConcreteBuilder:
public class WomanBuilder implements PersonBuilder {
Person person;
public WomanBuilder() {
person = new Woman();
}
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();
}
}
角色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;
}
}
public class Man extends Person {
public Man(){
System.out.println(“開始建造男人");
}
}
public class Woman extends Person {
public Woman(){
System.out.println(“開始建造女人");
}
}
測(cè)試:
public class Test{
public static void main(String[] args) {
PersonDirector pd = new PersonDirector();
Person womanPerson = pd.constructPerson(new ManBuilder());
Person manPerson = pd.constructPerson(new WomanBuilder());
}
}
建造者模式在使用過程中可以演化出多種形式:
如果具體的被建造對(duì)象只有一個(gè)的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導(dǎo)者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product里面實(shí)現(xiàn)。
在《Effective Java》書中第二條,就提到“遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器”,其實(shí)這里的構(gòu)建器就屬于建造者模式,只是里面把四個(gè)角色都放到具體產(chǎn)品里面了。
上面例子如果只制造男人,演化后如下:
public class Man {
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;
}
}
public class ManBuilder{
Man man;
public ManBuilder() {
man = new Man();
}
public void buildbody() {
man.setBody("建造男人的身體");
}
public void buildFoot() {
man.setFoot("建造男人的腳");
}
public void buildHead() {
man.setHead("建造男人的頭");
}
public Man builderMan() {
buildHead();
buildBody();
buildFoot();
return man;
}
}
測(cè)試:
public class Test{
public static void main(String[] args) {
ManBuilder builder = new ManBuilder();
Man man = builder.builderMan();
}
}