如何创建可以构建多种Java对象的Builder? [英] How do I create a Builder that can build more than one kind of Java object?

查看:181
本文介绍了如何创建可以构建多种Java对象的Builder?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一种 Multi Strategy Builder 。我的意思是这个建构者应该被泛化,应该有不同的方法取决于实体类型。让我解释一下。

I’m trying to create a kind of Multi Strategy Builder. I mean this builder should be generalized and should have different method depends on entity type. Let me explain it.

取决于我们需要具有不同方法的实体。示例:

Depends on entity we need to have different methods. Examples:

Builder<User> userBuilder;
userBuilder.withName(«Bob»);
userBuilder.withAge(17);

,此建立者必须没有其他方法!

and this builder must have no others method!

Builder<Account> accountBuilder;
accountBuilder.withCounry(«Fr»);
accountBuilder.withNumber(2846218354);
accountBuilder.withCode(«X34»);

我应该使用什么样的模式?如何组织我的设计?

What pattern should I use? And how to organize my design?

推荐答案

通用接口不可能有不同的方法,这取决于在Java中传递给它的类。这意味着 Builder 界面可以有:

It's not possible for generic interface to have different methods depending on passed to it class in Java. This means that Builder interface can have either:


  • withName withAge 方法

  • withCountry withNumber withCode 方法

  • 所有这些

  • withName and withAge methods
  • withCountry, withNumber and withCode methods
  • all of them

没有可以克服Java语言限制的设计模式。我建议使用通用构建器界面,如:

There is no design pattern that can overcome Java language limitations. What I would advise is to have generic builder interface like:

public interface Builder<T> {
    T build();
}

然后为每个实体类型创建单独的子类:

and then create separate subclasses for each entity type:

public class UserBuilder implements Builder<User> {

     public void withName(String name) {
         // ...
     }

     public void withAge(int age) {
         // ...
     }

     public User build() {
         User user = new User();
         user.setName(...);
         user.setAge(...);
         return user;
     }

}

public class AccountBuilder implements Builder<Account> {

    public void setCountry(String country) {
         // ...
    }

    public void setNumber(String number) {
         // ...
    }

    public void setCode(String code) {
         // ...
    }

    public Account build() {
         Account account = new Account();
         account.setCountry(...);
         account.setNumber(...);
         account.setCode(...);
         return account;
    }
}

然后使用它像

UserBuilder userBuilder = new UserBuilder();
userBuilder.setName("John");
userBuilder.setAge(20);
User user = userBuilder.build();

AccountBuilder accountBuilder = new AccountBuilder();
accountBuilder.setCountry("UA");
accountBuilder.setNumber("333-22-1");
accountBuilder.setCode("123");

就是这样。这可以通过使用 Fluent Interface 模式稍微改进,但无论如何在Java中它是不可能实施它的工作完全像你的问题。

And that's it. This can be slightly improved by using Fluent Interface pattern but anyway in Java it's impossible to implement it to work exactly like in your question.

希望这有帮助...

这篇关于如何创建可以构建多种Java对象的Builder?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆