我刚刚阅读了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();
}
}
}
答案 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 services
或daos
。当你谈到工厂时它更像是utils
类别,因为你期望各种类型的对象取决于你给工厂方法的输入方法。
因此,您的第一个代码段是一个简单的服务类,包含一些注入服务和覆盖方法。与工厂模式无关。此外,每个bean默认为singleton
。第二个代码片段是一个工厂,但与Spring没有任何关系。当然,你可能在工厂级别拥有自动服务,但同样没有任何授权和弹簧相关的服务。