构造函数有很多元素。如何重构(工厂模式)

时间:2012-11-05 05:55:56

标签: java constructor factory-pattern

我有一个带有Factory模式的构造函数。我传递给很多参数。如何重构它。

ServerFactory serverFactory = new ServerFactory();
CalendarResults calResults= serverFactory.getResults(serverName,locale, Day, week,     
                            month,vdate,results,uri, EmailShare, inc, upperLimit, 
                            endLimit,exchWD, YearMonthDay,WeekMonthDate);
results=calResults.serverNameDay(serverName,locale, Day, week, month,vdate,
        results,uri, EmailShare, inc, upperLimit, endLimit, exchWD, YearMonthDay);

public class ServerFactory {
    public CalendarResults getResults(String serverName,String locale, String day,    
                     String week, String month, 
             boolean vdate, ArrayList<CalendarOutput> results, String uri, 
                     List<String> emailShare, int inc, int upperLimit, 
             int endLimit, NexWebDav exchWD, String yearMonth, boolean 
                     weekMonthDate){

        CalendarResults calresults=null;
        if(serverName.equals("www.google.com")){
            calresults=new Google();
        }else{
            calresults=new Exchange();
        }
        return calresults;
    }
 }

5 个答案:

答案 0 :(得分:1)

您可以在serverFactory上设置多个setter方法,并且必须在调用getResults之前调用这些方法。

如果没有调用它们,getResults应该抛出异常。

序列如下:

serverFactory.setServerDetails(servername, locale);
serverFactory.setCalendarDetails(day, week, month, vdate, yearmonthday, weekmonthday);
...
...
serverFactory.getResults(results);

答案 1 :(得分:1)

很难说,因为你没有显示使用所有这些参数的所有代码(我假设)。

但是有些事情需要考虑:

  • 用值对象替换基本类型的参数,这使得在什么位置预期什么参数更清楚。

  • 将多个相关参数组合到值对象。一个显而易见的例子是upperLimit,endLimit(也许是inc),它可能最终出现在一个名为Intervall的对象中。

  • 用不同的方法替换布尔值。通常使用布尔值来执行不同的算法。如果是这样的话,那么布尔人就会采用单独的方法。

  • 如果你还有许多人和令人困惑的论点,你可能想要使用Builder模式。以下博文可能会有所帮助:http://blog.schauderhaft.de/2012/07/29/named-parameters-in-java/

答案 2 :(得分:0)

对所有String参数进行字符串化并将它们拆分为构造函数。但我建议您采用当前的方式。它更具可读性。

答案 3 :(得分:0)

不要发送这么多参数,而是考虑创建一个Value Object类,将其实例化并将该实例作为参数发送。

答案 4 :(得分:0)

另一种方式代码是对所有String类型参数使用String [],其位置交换很少,如下所示:

public CalendarResults getResults(boolean vdate, ArrayList<CalendarOutput> results,
                 List<String> emailShare, int inc, int upperLimit, 
                 int endLimit, NexWebDav exchWD, boolean weekMonthDate,
                 String... stringParams){
          //You may get your string params as
          //stringParams[0] -> serverName
          //stringParams[1] -> locale
          //stringParams[2] -> day
          //stringParams[3] -> week
          //stringParams[4] -> month
          //stringParams[5] -> uri
          //stringParams[6] -> yearMonth
          ....

虽然您现在可以使用工厂模式,但只更改所有字符串类型参数都会移动到最后,例如。

   CalendarResults calResults= serverFactory.getResults(vdate,results, 
                   EmailShare, inc, upperLimit, endLimit,exchWD, WeekMonthDate,
                   serverName, locale, Day, week, month, uri,YearMonthDay);

某种程度的简化。