在我的程序中,我同时在多个服务器上上传一个文件,如google drive,dropbox等。我正在使用适配器设计模式来调整每个服务器api,因此每个服务器具体类都实现了一个 FileServer 接口,最后我有一个FileServer对象列表。我的问题:由于我的程序将来必须支持新的服务器,封装所有服务器对象实例化的最佳方法是什么(我的意思是,“... =新...”部分)? / strong>我们想到的是工厂模式,但在工厂方法中返回列表是否正确?谢谢。
答案 0 :(得分:5)
通常,工厂模式封装了从某种“材料”(如规范)创建单个对象背后的复杂性。例如,给定URL,创建与URL定义的服务器的连接。
在您的情况下,规范的Factory模式将对文件存储(URL,上下文对象等)采用一些规范,并创建单个文件服务器对象。虽然没有什么可以禁止您从给定规范列表的工厂方法返回对象列表,但是迭代规范列表并为每个规范调用工厂方法几乎同样简单且可以说更清晰。像这样:
List<FileServer> fsList = new ArrayList<FileServer>();
for(FSSpec spec : fileServerSpecs)
{
FileServer fs = FileServerFactory.create(spec);
fsList.add(fs);
}
// do something with your list of file servers.
这也是更可重用的,因为在某些情况下您可能需要从规范创建单个文件服务器,而无需创建仅具有该规范的单项列表以传递给您的工厂方法。