使用工厂模式创建服务是否很好?

时间:2018-03-05 03:22:54

标签: design-patterns

我已阅读有关Factory Pattern的信息,它可用于根据某些条件动态创建对象。但是,根据这些条件创建Service类是一种规范。

class ServiceFactory { 

    DummService1 A;
    DummService2 B;
    DummService3 C;

    Service getService(String condition) {

      switch condition:
          case A:
             return new A()
          case B:
             return new B()
          case C:
             return new C()
    }
}

class DummyService1 implements Service{}
class DummyService2 implements Service{}
class DummyService3 implements Service{} 

以上是一个例子。另外,我试图在Spring中执行此操作,因此这些服务类是Autowired(不希望使用Spring Specific语法使上述示例复杂化)。

1 个答案:

答案 0 :(得分:1)

  

根据这些条件创建Service类是一种规范。

这是创建服务的一种方式。另一种可能是使用SPI和ServiceLoader。但是,您可以在服务本身中引入一种方法,以确定它是否合适。 E.g。

public Service {
    public boolean isSuitable(String condition);

    // ... Service methods
}

然后你可以用这种方式查找正确的服务

Service suitableService = null;

for(Service serviceCandidate : ServiceLoader.load(Service.class)){
   if(serviceCandidate.isSuitable(condition)){
        suitableService = serviceCandidate;
        break;
   }
}

在Java 8中,您可以使用方法引用映射替换开关:

private Map<String, Supplier<Service>> services = new HashMap<>();

public ServiceFactory() {
    services.put("A", A::new);
    services.put("B", B::new);
    services.put("C", C::new);
}

Service getService(String condition) {
    Supplier<Service> supplier = services.get(condition);
    if(supplier != null) {
        return supplier.get();
    }
    return null;
}
  

另外,我试图在Spring中执行此操作,因此这些服务类是Autowired

在春季执行此操作时,通常使用@Qualifier代替条件。

@Autowired
@Qualifier("A")
private Service service;