以下是基本构建器模式
enum AccountType {
BASIC,PREMIUM;
}
class AccountBuilder {
private AccountBuilder(Builder builder) {}
private static class PremiumAccountBuilder extends Builder {
public PremiumAccountBuilder () {
this.canPost = true;
}
public PremiumAccountBuilder image(Image image) {
this.image = image;
}
}
public static class Builder {
protected String username;
protected String email;
protected AccountType type;
protected boolean canPost = false;
protected Image image;
public Builder username(String username) {
this.username = username;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public Builder accountType(AccountType type) {
this.type = type;
return (this.type == AccountType.BASIC) ?
this : new PremiumAccountBuilder();
}
public Account builder() {
return new Account (this.name,this.email,this.type, this.canPost, this.image);
}
}
}
所以高级帐户基本上覆盖了canPost并可以设置图像。
我不确定我是否可以做类似
的事情Account premium = new AccountBuilder.Builder().username("123").email("123@abc.com").type(AccountType.PREMIUM).image("abc.png").builder();
在type
方法调用之后,如果它是高级帐户,那么我可以进行image
方法调用。
它给我一个错误,因为它无法识别并找到图像方法。我不确定这是否是正确的做法,或者有更好的方法吗?
答案 0 :(得分:1)
accountType
返回Builder
类型的对象,该对象没有image
方法。一种可能的解决方案是向image
类添加Builder
方法,忽略Image
,然后由PremiumBuilder
的{{1}}方法覆盖什么时候它可以用image
做一些有用的事情;另一种方法是将Image
传递给Image
方法,然后该方法负责将accountType
传递给Image
的构造函数