Java 如何在builder模式中分离其表示中的构造?

Java 如何在builder模式中分离其表示中的构造?,java,design-patterns,Java,Design Patterns,我有一个程序,我认为它代表了一个构建器模式,但我有一个问题,我不理解它与GofF表示中的单独构造 这是代码 public class IDMaker { public static void main(String[] args) { ... IDDirector director = new IDDirector(); IDBuilder idB; switch(role){ case 'a': { idB

我有一个程序,我认为它代表了一个构建器模式,但我有一个问题,我不理解它与GofF表示中的单独构造

这是代码

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;}
}
这是程序的抽象生成器

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;}
}
这是一个具体的建设者的计划

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;}
}
这是这个项目的成果

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;}
}

此程序中是否正确使用了生成器模式

对于不同的表示,相同的构造过程意味着您使用相同的方法(我不是指函数方式)来构建同一对象的不同变体(不要与继承混淆)

例如,假设您有这样一个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
}
构造Person对象时,即使对象表示可能会更改,您也必须提供所有参数,例如,没有中间名的Person。下一个最好的方法是创建一个只获取名字和姓氏的构造函数,这可能会解决问题。但从这个角度来看,每当我们意识到一个参数可能存在或不存在时,我们就需要添加一个构造函数。这种增长是指数2^N,其中N是参数的数量

解决了这个问题


关于你的解决方案,你几乎成功了。查看上面链接中的示例,找出您缺少的内容。

这不是一个构建器模式,请查看此示例