как использовать Builder Pattern? - PullRequest
0 голосов
/ 01 мая 2019

Я создаю представление entend FrameLayout, которое имеет около 10 параметров.

Я думал об использовании шаблона Builder, аналогичного тому, как работает AlertDialog. Однако я не совсем уверен, что будет лучшим способом реализовать это, или если это даже хорошая идея.

Вот пример того, о чем я думал, но со многими другими переменными.

в этом есть проблема.

Я хочу использовать переменные adDetailModel и dataLoader в init, которые builder получают.

public class DialogContentList extends FrameLayout {

public static DataLoader dataLoader;
static SwipeRefreshRelativeLayout contentList;
public static AdDetailModel adDetailModel;

public DialogContentList(@NonNull Context context) {
    super(context);

    init(context, null, 0);
}

public DialogContentList(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);

    init(context, attrs, 0);
}

public DialogContentList(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    init(context, attrs, defStyleAttr);
}

public static class Builder {

    private AdDetailModel adDetailModel;
    private DataLoader dataLoader;

    public Builder() {

    }


    public Builder setModel(AdDetailModel adDetailModel) {
        this.adDetailModel = adDetailModel;
        return this;
    }

    public Builder setDataloder(DataLoader dataLoader) {
        this.dataLoader = dataLoader;
        return this;
    }


    public DialogContentList build(final Context context) {
        DialogContentList dialogContentList = new DialogContentList(context);

        return dialogContentList;
    }
}

private void init( Context context, AttributeSet attrs, int defStyleAttr) {

    LayoutInflater.from(context).inflate(R.layout.dialog_content_list, this, true);
    contentList = (SwipeRefreshRelativeLayout) findViewById(R.id.ContentList);
  //
  //        contentList.build(new viewWrapper() {
  //            @Override
 //            public BaseWidget getView() {
 //                return new AdSample(context1, adDetailModel);
//            }
//        }, dataLoader);

 }

}

1 Ответ

0 голосов
/ 01 мая 2019

Ваша реализация шаблона Builder в принципе правильная, хотя я бы сказал, что Context следует передать конструктору вашего Builder.

Однако лично я бы не стал добавлять логику(т.е. DataLoader и AdViewModel) в мои View слои.Кроме того, ни одна из переменных в верхней части вашего класса не должна быть static, определенно SwipeRefreshRelativeLayout, что приведет к утечке памяти.

Где возможно, определите ваши View полностью в XML,и используйте шаблон Model-View-Presenter для отделения вашего пользовательского интерфейса от вашей логики.Вы получите гораздо более гибкую архитектуру.

...