Java 如何在builder模式中分离其表示中的构造?
我有一个程序,我认为它代表了一个构建器模式,但我有一个问题,我不理解它与GofF表示中的单独构造 这是代码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
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是参数的数量
解决了这个问题
关于你的解决方案,你几乎成功了。查看上面链接中的示例,找出您缺少的内容。这不是一个构建器模式,请查看此示例