2015-12-08 50 views
2

我有這個計劃,我認爲它代表了一種生成器模式,但我有這個擔心,我不明白從戈夫其代表性的獨立建築。如何在構建器模式中將構造分離出來?

這裏是代碼,

public class IDMaker { 
public static void main(String[] args) { 
    ... 
    IDDirector director = new IDDirector(); 
    IDBuilder idB; 
    switch(role){ 
     case 'a': { 
        idB = new StudentIDBuilder(idnumber, fname, lname); 
        break; 
       } 
     case 'b': { 
        idB = new FacultyIDBuilder(idnumber, fname, lname); 
        break; 
       } 
     default: { 
        idB = new StudentIDBuilder(idnumber, fname, lname); 
        break; 
       } 
    } 
    director.MakeID(idB); 
    ID id = idB.getID(); 
    ... 
    } 
} 

這是導演類的程序。

public class IDDirector { 
public void MakeID(IDBuilder idB){ 
    idB.addIDNumber(); 
    idB.addName(); 
    idB.addWidth(); 
    idB.addHeight(); 
} 
} 

這是該程序的抽象生成器。

abstract class IDBuilder{ 
    public abstract void addIDNumber(); 
    public abstract void addName(); 
    public abstract void addWidth(); 
    public abstract void addHeight(); 
    public abstract ID getID(); 
} 

這是該計劃的具體建設者之一。

class StudentIDBuilder extends IDBuilder{ 
    String idnumber; 
    String fname; 
    String lname; 
    int width = 180; 
    int height = 300; 
    StudentIDBuilder(String idnumber, String fname,String lname){ 
     this.idnumber=idnumber; 
     this.fname=fname; 
     this.lname=lname; 
    } 

    private ID id = new ID(); 
    public void addIDNumber(){id.idnumber = this.idnumber;} 
    public void addName(){id.fname = this.fname;id.lname = this.lname;} 
    public void addWidth(){id.width = this.width;} 
    public void addHeight(){id.height = this.height;} 
    public ID getID(){return id;} 
} 

這是該程序的產物。

class ID{ 
    public String idnumber; 
    public String fname; 
    public String lname; 
    public int width; 
    public int height; 
    public String getIDNumber(){return this.idnumber;} 
    public String getName(){return this.lname + ", " + fname;} 
    public String getSize(){return width + "x" + height;} 
} 

構建模式在這個程序中是否正確使用?對於不同的表示

+2

它不是一個生成器模式,看看這個http://www.javaworld.com/article/2074938/core-java/too-many-parameters-in-java-methods-part-3-builder- pattern.html –

回答

0

同樣的構建過程意味着你用同樣的方法(我不聰明的意思是一個函數)來構建同一個對象的不同變體(不具有繼承混淆)。

例如,讓說你有一個Person類這樣的 -

public class Person { 
    private String name = ""; 
    private String surname = ""; 
    private String middleName = ""; 

    public Person(String name, String middleName, String surname) { 
     this.name = name; 
     this.middleName = middleName; 
     this.surname = surname; 
    } 

    //.. a bunch of getters 
} 

當你構建你是有界的,提供所有的參數,即使對象表示可以改變一個人的對象,例如一個人有沒有中間名。下一個最好的事情是創建一個構造函數,它只能得到名字和姓氏,這可能會解決問題。但從這個角度來看,只要我們意識到參數可能存在或不存在,我們就需要添加一個構造函數。這種增長是指數2^N,其中N是參數的數量。

Builder pattern解決了這個問題。

關於您的解決方案,你幾乎得到了它。看看上面的鏈接中的示例,找出你缺少的東西。