默认情况下,Spring是否使用工厂模式?

时间:2015-11-17 11:18:02

标签: java spring spring-mvc design-patterns

我刚刚阅读了Head First Design Patterns Book中的工厂模式。我只是想知道,默认情况下,Spring是否使用它。

我们说我有一个AppConfigServiceImpl.java:

@Service("appConfigService")
public class AppConfigServiceImpl implements AppConfigService {

    @Autowired
    private UserService userService;
    @Autowired
    private IdGeneratorService idGeneratorService;

    @Override
    public void initializeUserId() {
        final Integer lastUserId = userService.getLastId();
        idGeneratorService.initialize(lastUserId);
    }
}

AppConfigService不是工厂类接口吗?而AppConfigServiceImpl是具体的类?而initializeUserId()是工厂方法吗?

或者如果我有这样的结构怎么办:

public abstract class User 
public class AdminUser extends User
public class BusinessUser extends User

public class UserServiceImpl implements UserService {
    @Override
    public User getUser(String userType) {
        if (UserType.ADMIN.toString.equalsIgnoreCase(userType)) {
            return new AdminUser();
        } else {
            return new BusinessUser();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

不,这不完全是工厂模式。

正如名字所说,工厂生产一些东西。在软件中,工厂生产物体。因此,如果您希望拥有Car个实例,可以使用CarFactory说:

Car myCar = CarFactory.produceACar();

这就是整个模式。你有一个类(CarFactory)封装了一个对象的生成(Car)。重要的是,课程的目的是做到这一点。只返回一个对象不足以成为工厂;)

在您的示例中,方法UserServiceImpl#getUser可能是某种工厂方法,因为它根据输入返回不同类型的对象。但并非每个为不同输入返回不同内容的方法都是工厂 - 几乎每种方法都会以某种方式执行此操作。

在您的示例中,您可以创建UserFactory可以使用的UserServiceImpl。您可以创建AdminUserFactory(创建管理员)和BusinessUserFactory(创建业务用户)。 getUser方法将使用两个工厂来摆脱对象的具体实例化机制。

答案 1 :(得分:0)

如果您想查看Spring中实现的Factory模式示例,请查看FactoryBean。它可以帮助您使用自定义初始化逻辑初始化bean。 Spring还提供了使用工厂方法初始化bean的功能。 而且,主要是整个Spring应用程序上下文是BeanFactory

答案 2 :(得分:0)

两者都非常不同。并且说Spring至少使用了你在第1个代码片段中提到的服务类的FactoryPattern是不正确的。

在开始逻辑之前理解命名约定。 Service是和接口,ServiceImpl是它的具体实现。每项服务可能包含其他h elper servicesdaos。当你谈到工厂时它更像是utils类别,因为你期望各种类型的对象取决于你给工厂方法的输入方法。

因此,您的第一个代码段是一个简单的服务类,包含一些注入服务和覆盖方法。与工厂模式无关。此外,每个bean默认为singleton。第二个代码片段是一个工厂,但与Spring没有任何关系。当然,你可能在工厂级别拥有自动服务,但同样没有任何授权和弹簧相关的服务。