0

我有一个工厂模式的构造函数。我正在传递许多参数。如何重构它。

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;
    }
 }
4

5 回答 5

1

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

如果那些没有被调用,getResults应该抛出一个异常。

顺序可能如下:

serverFactory.setServerDetails(servername, locale);
serverFactory.setCalendarDetails(day, week, month, vdate, yearmonthday, weekmonthday);
...
...
serverFactory.getResults(results);
于 2012-11-05T06:08:37.777 回答
1

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

但这里有一些事情需要考虑:

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

  • 将多个相关参数组合到值对象。一个看起来很明显的例子是upperLimit、endLimit(也可能是inc),它们最终可能会出现在一个名为Intervall 的对象中。

  • 用不同的方法替换布尔值。通常布尔值用于执行不同的算法。如果是这种情况,请删除布尔值并改为使用单独的方法。

  • 如果您仍然有很多且令人困惑的论点,您可能想要使用构建器模式。这和以下博客文章可能会有所帮助:http: //blog.schauderhaft.de/2012/07/29/named-parameters-in-java/

于 2012-11-05T06:19:59.933 回答
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);

某种程度的简化。

于 2012-11-05T06:12:58.403 回答
0

将所有 String 参数字符串化并将它们拆分到构造函数中。但我推荐你目前的做法。它更具可读性。

于 2012-11-05T06:00:05.587 回答
0

与其发送这么多参数,不如考虑创建一个值对象类,将其实例化并将该实例作为参数发送。

于 2012-11-05T06:06:57.143 回答