設計模式-創建型模式#建造者模式Builder
設計模式-創建型模式#抽象工廠AbstractFactory
建造者模式
將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
適用性
1、當創建復雜對象的算法應該獨立于改對象的組成部分以及它們的裝配方式時。
2、當構造過程必須允許被構造的對象有不同的表示時。
參與者
1、Builder
為創建一個Product對象的各個部件指定抽象接口。
2、ConcreteBuilder
實現Builder的接口以構造和裝配該產品的各個部件。
定義并明確它所創建的表示。
提供一個檢索產品的接口。
3、Director
構造一個使用Builder接口的對象
4、Product
表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示并定義它
的裝配過程。
包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
類圖:
實線箭頭表示單向關聯,即:關聯類知道被關聯類的公共屬性及操作,但被關聯類 并不知道關聯類的公共屬性及操作。
關聯單向、雙向之分。雙向關聯用沒有箭頭的實線表示 ,實線箭頭表示Object Message,也就是類間的消息發送,
比如:方法調用和請求等等,這些都是從一方向另一方主動發出信息。
虛線箭頭表示兩個類之間存依賴關系。即:一個類引用另一個類。只存在單向依賴。 虛線箭頭表示Return Message,
虛線箭頭表示兩個類之間存依賴關系。即:一個類引用另一個類。只存在單向依賴。 虛線箭頭表示Return Message,
一般用于表示方法調用后的返回信息
代碼中的表現:
實線代表有引用的關聯,一般代碼中會直接有關聯的類的引用,但虛線就沒有,一般知識方法上的調用關系。如是而已。
package com.dsp;
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;
}
}
package com.dsp;
public class Man extends Person {
}
package com.dsp;
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
Person buildPerson();
}
package com.dsp;
public class ManBuilder implements PersonBuilder {
Person person;
public ManBuilder() {
person = new Man();
}
@Override
public void buildHead() {
person.setHead("建造男人的頭");
}
@Override
public void buildBody() {
person.setBody("建造男人的身體");
}
@Override
public void buildFoot() {
person.setFoot("建造男人的腳");
}
@Override
public Person buildPerson() {
return person;
}
}
package com.dsp;
public class PersonDirector {
public Person constructPerson(PersonBuilder pb){
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}
package com.dsp;
public class Test {
public static void main(String[] args) {
PersonDirector pd = new PersonDirector();
Person person = pd.constructPerson(new ManBuilder());
System.out.println(person.getHead());
System.out.println(person.getBody());
System.out.println(person.getFoot());
}
}
控制臺輸出:
建造男人的頭
建造男人的身體
建造男人的腳

浙公網安備 33010602011771號