我最近改变了工作,我正在为大型在线零售商店开发WebSphere Commerce项目,在代码中有各种工厂用于获取各种服务的实例。然而,他们所做的只是每次都返回一个新对象。 e.g。
public class DataAccessServiceFactory {
public static DataAccessService getDataAccessService(){
return new DataAccessService();
}
这感觉就像一个反模式,它可能会不必要地耗尽资源,而应该返回一个单例实例。这些服务可能只有一个或两个私有字段,但是会有数百万用户,因此有数百万个不必要的对象。
所以我想知道的是除了工厂本身有点无意义,因为你可以在不调用工厂的情况下创建一个新对象,这真的会对现实世界的使用产生任何影响,并且可能会产生一些好处每次需要使用它时都有新服务吗?
[编辑] 更详细一点: 有各种REST服务用于在数据库中查询或创建条目,例如查找产品或使用这些服务添加到购物车等。服务本身是无国籍的。
答案 0 :(得分:2)
如果DataAccessService具有状态,则它不应该是单例。一百万用户都会为该类的每个属性拥有自己的值,并且在多用户/多线程环境中共享它将是同步灾难。
此类的优点可能与依赖项反转有关。如果用于创建DataAccessService的新机制完全作为新类实现,例如SubDataAccessService(扩展DataAccessService),则在getDataAccessService()中更新返回类型后,调用getDataAccessService()的所有类都将接收新的子类型。这样可以避免重构所有调用
的代码 new DataAccessService()
到
new SubDataAccessService()
答案 1 :(得分:0)
如果DataAccessService不是无状态的,例如它可以是非活动的和活动的,并且每个用户将根据逻辑更新它,那么它就不是单身。
答案 2 :(得分:0)
通常,Service没有状态,但是处理数据并在DAO层和User / Frontend之间形成桥梁的方法。如果服务没有类级别对象,则使用facotry返回新实例时没有太多逻辑。
答案 3 :(得分:0)
这实际上是依赖于实现的问题。
单身人士的缺点是它在记忆中存在了很长时间,因为它在范围的末尾不像常规物体一样被解除分配。
如果它缓存内容或内存泄漏,它也可能会占用大量内存。
另一方面,如果它是可以被许多对象重用的东西,特别是如果它需要时间来初始化(比如需要连接到数据库的DAO对象),那么它可能是非常有益的