首页 > 解决方案 > 如何使用建造者模式?

问题描述

我正在创建一个包含大约 10 个参数的视图框架 FrameLayout。

我正在考虑使用 Builder 模式,类似于 AlertDialog 的工作方式。但是,我不确定实现这一点的最佳方法是什么,或者它是否是一个好主意。

这是我在想的一个例子,但有更多的变量。

这有问题。

我想使用变量adDetailModeldataLoaderinit其中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);

 }

}

标签: androiddesign-patternsbuilder

解决方案


您的Builder模式实现基本上是正确的,尽管我认为Context应该将其传递给您的 Builder 的构造函数。

但是,就我个人而言,我不会在我的图层中添加逻辑(即DataLoaderand AdViewModel) 。View此外,类顶部的任何变量都不应该是static,当然SwipeRefreshRelativeLayout,这会导致内存泄漏。

在可能的情况下,完全在 XML 中定义您View的 s,并使用 Model-View-Presenter 模式将您的 UI 与您的逻辑分开。您最终将获得一个更加灵活的架构。


推荐阅读