【发布时间】:2020-05-16 23:17:33
【问题描述】:
我有一个用例,我需要根据某些条件定义和调用不同的 RequestPreparationManager。假设条件是需要调用经理的团队名称(我正在创建一个将由我的组织中的多个团队使用的伞式框架)。我的问题是哪种设计模式最适合这种情况?我对我认为可以在这里使用的两种设计模式感到困惑——工厂设计模式和策略设计模式。但就最佳面向对象设计实践而言,我无法确定这两种设计模式中的哪一种(或任何其他适合这种情况的设计模式)是最好的。
我已经编写了一个非常基本的类定义,说明使用工厂和策略设计模式实际实现的样子:
// Common classes and interfaces
public interface RequestPreparationManager
{
InputRequest prepareInputRequest(Map<String, Object> params);
}
public class MarvelRequestPreparationManager implements RequestPreparationManager
{
@Override
public InputRequest prepareInputRequest(Map<String, Object> params)
{
// Some Logic
}
}
public class DCRequestPreparationManager implements RequestPreparationManager
{
@Override
public InputRequest prepareInputRequest(Map<String, Object> params)
{
// Some Logic
}
}
// Factory Design Pattern
public class RequestPreparationManagerFactory
{
public static RequestPreparationManager getManager(String teamName)
{
switch(teamName)
{
case "Marvel" :
return new MarvelRequestPreparationManager();
case "DC" :
return new DCRequestPreparationManager();
case default :
throw new UnsupportedTypeException();
}
}
}
public class Driver
{
public static void main()
{
Map<String, Object> params = new HashMap<>();
InputRequest request = RequestPreparationManagerFactory.getManager("Marvel").prepareInputRequest(params);
}
}
// Strategy Design Pattern
public class RequestPreparationManagerStrategy
{
private Map<String, Object> params;
public RequestPreparationManagerStrategy(Map<String, Object> params)
{
this.params = params;
}
public InputRequest prepareInputRequest(RequestPreparationManager requestPreparationManager)
{
return requestPreparationManager.prepareInputRequest(params);
}
}
public class Driver
{
public static void main()
{
Map<String, Object> params = new HashMap<>();
RequestPreparationManagerStrategy strategy = new RequestPreparationManagerStrategy(params);
InputRequest request = strategy.prepareInputRequest(new MarvelRequestPreparationManager());
}
}
【问题讨论】:
标签: java oop design-patterns solid-principles clean-architecture