android - 如何使用建造者模式?
问题描述
我正在创建一个包含大约 10 个参数的视图框架 FrameLayout。
我正在考虑使用 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);
}
}
解决方案
您的Builder
模式实现基本上是正确的,尽管我认为Context
应该将其传递给您的 Builder 的构造函数。
但是,就我个人而言,我不会在我的图层中添加逻辑(即DataLoader
and AdViewModel
) 。View
此外,类顶部的任何变量都不应该是static
,当然SwipeRefreshRelativeLayout
,这会导致内存泄漏。
在可能的情况下,完全在 XML 中定义您View
的 s,并使用 Model-View-Presenter 模式将您的 UI 与您的逻辑分开。您最终将获得一个更加灵活的架构。
推荐阅读
- node.js - 防止多个 NodeJS 实例处理 Redis PubSub 事件
- json - Swift 使用应用程序沙箱内文件中的 JSON
- flutter - 如何在颤动中使用扩展图像裁剪图像
- swift - Amadeus 航班优惠搜索未完成 [SWIFT API] 是错误吗?
- typescript - 角度 5 中的数据渲染问题
- mysql - (具有挑战性的 sql)比较两个表的不同值
- pre-trained-model - 我正在寻找不同领域的预训练模型。前 BioBert 或 FinBert
- google-apps-script - 是否可以根据下拉列表动态设置多个 Google 表格图表标题
- traminer - 独特的序列太多
- macros - Racket 宏用于字符串化除 s 表达式之外的所有表达式