如果使用单例或新对象实例会有什么不同吗?

时间:2017-07-13 13:49:41

标签: java performance singleton

我最近改变了工作,我正在为大型在线零售商店开发WebSphere Commerce项目,在代码中有各种工厂用于获取各种服务的实例。然而,他们所做的只是每次都返回一个新对象。 e.g。

public class DataAccessServiceFactory {

  public static DataAccessService getDataAccessService(){
    return new DataAccessService();
  }

这感觉就像一个反模式,它可能会不必要地耗尽资源,而应该返回一个单例实例。这些服务可能只有一个或两个私有字段,但是会有数百万用户,因此有数百万个不必要的对象。

所以我想知道的是除了工厂本身有点无意义,因为你可以在不调用工厂的情况下创建一个新对象,这真的会对现实世界的使用产生任何影响,并且可能会产生一些好处每次需要使用它时都有新服务吗?

[编辑] 更详细一点: 有各种REST服务用于在数据库中查询或创建条目,例如查找产品或使用这些服务添加到购物车等。服务本身是无国籍的。

4 个答案:

答案 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对象),那么它可能是非常有益的