簡體   English   中英

當多個類繼承單個抽象 class 時使用構建器模式

[英]Using a Builder Pattern when a multiple classes inherits a single abstract class

我正在使用兩個實體構建 web 應用程序:

  1. 漫畫 - id、標題、releaseDate、coverId、流派、作者、卷等
  2. 漫畫量 - id、標題、releaseDate、coverId、isbn、頁面等

這兩個類繼承自抽象的 class Book。 這本書 class 將具有兩個類的公共變量:id、title、releaseDate、coverID;

我正在使用 Pattern Builder 來創建 Manga 和 Volume 對象。 但是當我嘗試 setDescription 時,我收到了這個錯誤:

        Manga manga = (Manga) new Manga.Builder().setID(id)
                                     .setTitle(title)
                                     .setCoverID(id)
                                     .setDescription() //Cannot resolve method 'setDescription' in 'Builder'
                                     .build();

預訂 class:

公共抽象 class Book<T extends Book> {

public final Long id;
public final String title;

protected Book(final Builder<T> builder) {
    this.id = builder.id;
    this.title = builder.title;
}

public abstract static class Builder<T> {
    private Long id;
    private String title;

    public Builder<T> setID(Long id) {
        this.id = id;
        return this;
    }

    public Builder<T> setTitle(String title) {
        this.title = title;
        return this;
    }

    public abstract T build();
}

我的漫畫 class:

public class Manga extends Book<Manga> {

private final String description;

protected Manga(Builder builder) {
    super(builder);
    this.description = builder.description;
}

public static class Builder extends Book.Builder<Manga> {
    
    private String description;

    public Builder setDescription(String description) {
        this.description = description;
        return this;
    }

    @Override
    public Manga build() {
        return new Manga(this);
    }
}

還是有更好的解決方案?

謝謝。

這應該工作:

package de.dwosch;

public abstract class Book {

    public final Long id;
    public final String title;

    protected Book(final Builder<?> builder) {
        this.id = builder.id;
        this.title = builder.title;
    }

    public abstract static class Builder<T extends Builder<T>> {
        private Long id;
        private String title;

        public T id(Long id) {
            this.id = id;
            return me();
        }

        public T title(String title) {
            this.title = title;
            return me();
        }

        public abstract T me();
        public abstract Book build();
    }
}

接着

package de.dwosch;

public class Manga extends Book {

    private final String description;

    protected Manga(Builder builder) {
        super(builder);
        this.description = builder.description;
    }

    public static class Builder extends Book.Builder<Builder> {

        private String description;

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        @Override
        public Builder me() {
            return this;
        }

        @Override
        public Manga build() {
            return new Manga(this);
        }
    }
}

用法

    Manga manga = new Manga.Builder().description("test")
            .title("title")
            .build();

我已經多次實現了這種模式。 Joshua Bloch 在他的書 Effective Java (順便說一句很棒的書)中寫道。

如果您需要這方面的更多信息,請告訴我。

順便說一句:個人偏好 - 沒有在構建器流程上set的設置器方法。 看起來“更干凈”:)

暫無
暫無

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

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