Java 如何以正确的方式实现Builder设计模式?

Java 如何以正确的方式实现Builder设计模式?,java,.net,oop,design-patterns,builder,Java,.net,Oop,Design Patterns,Builder,在学习设计模式时,我发现了构建器模式的不同实现。一些实现使用接口/抽象类来表示构建器,其他实现仅使用静态类。 哪一种是实现Builder设计模式的正确方法 下面是一个使用抽象类(ComputerBuilder)()的实现 下面是另一个实现,既不使用抽象类也不使用接口,而是使用静态类。() 如果你真的读了这本书,你可能会注意到它很早就指出 “我想明确指出,我将在本帖中讨论的构建器模式与Gangoff在《设计模式》一书中提到的有所不同。”(作者重点) 过了一会儿,他或她写道: “对我来说,构建器模式

在学习设计模式时,我发现了构建器模式的不同实现。一些实现使用接口/抽象类来表示构建器,其他实现仅使用静态类。 哪一种是实现Builder设计模式的正确方法

下面是一个使用抽象类(ComputerBuilder)()的实现

下面是另一个实现,既不使用抽象类也不使用接口,而是使用静态类。()

如果你真的读了这本书,你可能会注意到它很早就指出

“我想明确指出,我将在本帖中讨论的构建器模式与Gangoff在《设计模式》一书中提到的有所不同。”(作者重点)

过了一会儿,他或她写道:

“对我来说,构建器模式更像。”

注意这个小限定词,对我来说

这应该告诉您,您看到的不是模式的“规范”表示,而是一种变体

也就是说,这些陈述是正确的

可以用其他方式来表达一个概念。我们应该小心,不要把四人帮的书提升到无懈可击的地位。

对我来说(双关语)Builder是自该书出版以来改进的GoF模式的最好例子。我相信是Josh Bloch的高效Java版本推广了静态方法;但也有一些源于博客帖子的版本比GoF版本更有用和/或更简单

每当我回顾GoF的书时,我从不重读构建器一章,因为有更好的替代品。当然,你必须决定哪种选择更适合你

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