【发布时间】:2021-08-11 07:52:31
【问题描述】:
我的目标是使用构建器模式根据产品类别创建产品详细信息字段。
无论产品类别如何,这是基本的ProductDetails 属性。
int stock; // required
String ships_from; // required
String brand; // optional
计算机类可以有
String model; // optional
String screen_size; // optional
String warranty_period; // optional
食品类可以有
String shelf_life; // required
String expiration_date; // optional
这是我使用的基本构建器模式
public class ProductDetails {
// attributes
private ProductDetails(ProductDetailsBuilder builder) {
this.attribute1 = builder.attribute1;
this.attribute2 = builder.attribute2; // and so on.
}
// getters
public static class ProductDetailsBuilder {
// attributes
public ProductDetailsBuilder(//required attributes) {
this.attribute1 = attribute1;
}
// setters
public ProductDetails build() { return new ProductDetails(this); }
}
}
当我尝试将ProductDetails 类扩展为例如ProductDetails_Computer 或ProductDetails_Food 类时出现问题。
public class ProductDetails_Computer extends ProductDetails {
// attributes
private ProductDetails_Computer(ProductDetails_ComputerBuilder builder) {
this.attribute1 = builder.attribute2;
}
// getters
public static class ProductDetails_ComputerBuilder {
// attributes.
// setters
public ProductDetails_Computer build() { return new ProductDetails_Computer(this); }
}
}
我的预期结果:我可以做到public class ProductDetails_Computer extends ProductDetails。
我的实际结果:因为ProductDetails 构造函数是私有的/受保护的,所以我不能扩展。有些网站禁止使用公共构造函数以避免直接初始化,我同意这种做法。
【问题讨论】:
-
也许这thread 有帮助?
标签: java builder builder-pattern