簡單明瞭的體會構建者模式

烏托拉賽文發表於2023-03-19

我們由一個小小的Demo來引出主題,儘管這個Demo有點長~~,我相信還是值得你一看的!

木蘭詩中有:“雄兔腳撲朔,雌兔眼迷離;雙兔傍地走,安能辨我是雌雄?”

物件之間的比較想必大家都很熟悉。只須用 util 包中的Objects.equals()方法即可。如果我想找出物件之間不相同的屬性呢?
那肯定是一個一個屬性進行物件啊!
不錯,的確是要一個一個的進行物件,然後找出不有差異的屬性Key。

public class DiffTest {

    public static void main(String[] args) {
        Person wanger1 = new Person("王小二", 12);
        Person wanger2 = new Person("汪小二", 12);

        System.out.println(wanger1.diff(wanger2));
    }



    @Getter
    @Setter
    public static class Person implements Diffable<Person> {
        private String name;
        private Integer age;

        public Person() {}

        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }


        @Override
        public DiffResult<Person> diff(Person that) {
            return new DiffBuilder(this, that, ToStringStyle.NO_CLASS_NAME_STYLE)
                    .append("name", this.name, that.name)
                    .append("age", this.age, that.age)
                    .build();
        }
    }

}
  • 依賴的三方包
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
  </dependency>

上面的Test藉助了Diffable 這個介面來支援可以進行比對,(一般介面申明成 xxxable 代表著這個類支援某個功能,比如 JsonableComparable�...等)
那麼 diff(T obj)方法 借用了 DiffBuilder 這個類來構建出比對後的結果,裡面的寫法展示了具體構建的過程。最後由build� 方法返回需要構建出的物件。

最上層的介面非常的簡單!(定義介面難道不是越簡單越好?)

public interface Builder<T> {

    /**
     * Returns a reference to the object being constructed or result being
     * calculated by the builder.
     *
     * @return the object constructed or result calculated by the builder.
     */
    T build();
}

所以構建者模式,就是用程式碼構建一個物件,他演示了一個物件的構建過程,實現方法完全自己實現,我個人非常喜歡這種介面,給你一個白紙隨你畫,當然給你限定了T(總不定義一個狗但build一個貓出來吧!)。是不是和寫作文一樣,擬定好一個主題,然後圍繞著主題發揮你的文采吧!

那麼透過本文你可以學習到以下知識點

  • 如何找出物件之間的差異(分辨出雌雄兔子)
  • 構建者的上層介面及實際用法之一

相關文章