簡體   English   中英

如何以正確的方式實現構建器設計模式?

[英]How to implement the Builder Design Pattern in the right way?

在學習設計模式時,我發現了 Builder 模式的不同實現。 一些實現使用接口/抽象類來表示構建器,其他實現只使用 static class。 哪一種是實現構建器設計模式的正確方法?

下面,一個使用抽象 class(ComputerBuilder)的實現( 來源

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

        }

    }

下面,另一個實現,既不使用抽象 class 也不使用接口,而是使用 static class 代替。 來源

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

如果您真的閱讀了第二篇文章,您可能會注意到它很早就指出

“我想明確一點,我將在這篇文章中討論的構建器模式與 GangOfFour “設計模式”一書中提到的略有不同。” (作者強調)

過了一會兒,他或她寫道:

“對我來說,建造者模式更像是流暢的界面。”

注意小限定符,對我來說

這應該告訴您,您看到的不是模式的“規范”表示,而是一種變體。

也就是說,這些表示是相同基本思想的變體

看看表達概念的替代方法是可以的。 我們應該小心,不要將四人幫的書提升到無懈可擊的地位。

對我來說(雙關語)Builder 是自本書出版以來得到改進的 GoF 模式的最佳示例。 我相信是來自 Effective Java 的 Josh Bloch 的版本普及了 static 方法; 但是有些版本源自博客文章,它們比 GoF 版本更有用和/或更簡單。

當我經常回顧 GoF 書時,我從不重讀 Builder 章節,因為有更好的替代品。 當然,您必須決定哪種選擇更適合您

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM