Java 如何以正确的方式实现Builder设计模式?
在学习设计模式时,我发现了构建器模式的不同实现。一些实现使用接口/抽象类来表示构建器,其他实现仅使用静态类。 哪一种是实现Builder设计模式的正确方法 下面是一个使用抽象类(ComputerBuilder)()的实现 下面是另一个实现,既不使用抽象类也不使用接口,而是使用静态类。() 如果你真的读了这本书,你可能会注意到它很早就指出 “我想明确指出,我将在本帖中讨论的构建器模式与Gangoff在《设计模式》一书中提到的有所不同。”(作者重点) 过了一会儿,他或她写道: “对我来说,构建器模式更像。” 注意这个小限定词,对我来说 这应该告诉您,您看到的不是模式的“规范”表示,而是一种变体 也就是说,这些陈述是正确的 可以用其他方式来表达一个概念。我们应该小心,不要把四人帮的书提升到无懈可击的地位。对我来说(双关语)Builder是自该书出版以来改进的GoF模式的最好例子。我相信是Josh Bloch的高效Java版本推广了静态方法;但也有一些源于博客帖子的版本比GoF版本更有用和/或更简单 每当我回顾GoF的书时,我从不重读构建器一章,因为有更好的替代品。当然,你必须决定哪种选择更适合你Java 如何以正确的方式实现Builder设计模式?,java,.net,oop,design-patterns,builder,Java,.net,Oop,Design Patterns,Builder,在学习设计模式时,我发现了构建器模式的不同实现。一些实现使用接口/抽象类来表示构建器,其他实现仅使用静态类。 哪一种是实现Builder设计模式的正确方法 下面是一个使用抽象类(ComputerBuilder)()的实现 下面是另一个实现,既不使用抽象类也不使用接口,而是使用静态类。() 如果你真的读了这本书,你可能会注意到它很早就指出 “我想明确指出,我将在本帖中讨论的构建器模式与Gangoff在《设计模式》一书中提到的有所不同。”(作者重点) 过了一会儿,他或她写道: “对我来说,构建器模式
public class LaptopBuilder : ComputerBuilder
{
Computer computer;
public LaptopBuilder()
{
computer = new Computer("Laptop");
}
public override void BuildOS()
{
//TODO
}
public override void BuildDevice()
{
//TODO
}
public Computer ComputerType
{
get { return computer; }
}
}
public class DesktopBuilder : ComputerBuilder
{
Computer computer;
public DesktopBuilder()
{
computer = new Computer("Desktop");
}
public override void BuildOS()
{
//TODO
}
public override void BuildDevice()
{
//TODO
}
public Computer ComputerType
{
get { return computer; }
}
}
public class User
{
//All final attributes
private final String firstName; // required
private final String lastName; // required
private final int age; // optional
private final String phone; // optional
private final String address; // optional
private User(UserBuilder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
//All getter, and NO setter to provde immutability
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public String getPhone() {
return phone;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "User: "+this.firstName+", "+this.lastName+", "+this.age+", "+this.phone+", "+this.address;
}
public static class UserBuilder
{
private final String firstName;
private final String lastName;
private int age;
private String phone;
private String address;
public UserBuilder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public UserBuilder address(String address) {
this.address = address;
return this;
}
//Return the finally consrcuted User object
public User build() {
User user = new User(this);
validateUserObject(user);
return user;
}
private void validateUserObject(User user) {
//Do some basic validations to check
//if user object does not break any assumption of system
}
}
}