定義:
建造者模式:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
實用範圍
1、當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2、當構造過程必須允許被構造的對象有不同表示時。
角色
在這樣的設計模式中,有以下幾個角色:
1、Builder:爲創建一個產品對象的各個部件指定抽象接口。
2、ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
3、Director:構造一個使用Builder接口的對象,指導構建過程。
4、Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
角色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(“開始建造女人");
- }
- }
測試:
- 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());
- }
- }
建造者模式在使用過程中可以演化出多種形式:
如果具體的被建造對象只有一個的話,可以省略抽象的Builder和Director,讓ConcreteBuilder自己扮演指導者和建造者雙重角色,甚至ConcreteBuilder也可以放到Product裏面實現。
在《Effective Java》書中第二條,就提到“遇到多個構造器參數時要考慮用構建器”,其實這裏的構建器就屬於建造者模式,只是裏面把四個角色都放到具體產品裏面了。
上面例子如果只製造男人,演化後如下:
- 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;
- }
- }
測試:
- public class Test{
- public static void main(String[] args) {
- ManBuilder builder = new ManBuilder();
- Man man = builder.builderMan();
- }
- }