动态生成器模式

时间:2013-07-24 15:54:26

标签: java polymorphism builder

以下是基本构建器模式

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方法调用。

它给我一个错误,因为它无法识别并找到图像方法。我不确定这是否是正确的做法,或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

accountType返回Builder类型的对象,该对象没有image方法。一种可能的解决方案是向image类添加Builder方法,忽略Image,然后由PremiumBuilder的{​​{1}}方法覆盖什么时候它可以用image做一些有用的事情;另一种方法是将Image传递给Image方法,然后该方法负责将accountType传递给Image的构造函数