繁体   English   中英

如果使用单例或新的对象实例,这有什么区别吗?

[英]Does it make any difference if a singleton is used or new object instance?

我最近换了工作,并且正在为大型在线零售商店从事WebSphere Commerce项目,在代码中,有许多工厂用于获取各种服务的实例。 但是,他们所做的只是每次都返回一个新对象。 例如

public class DataAccessServiceFactory {

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

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

因此,我想知道的是,除了工厂本身没有意义之外,因为您可以在不调用工厂的情况下创建新对象,这真的会在实际使用中有所不同,并且为每一个新服务生成一个新的服务是否会有好处?您需要使用什么时间?

[编辑]更详细:使用这些服务,可以使用多种REST服务来查询或在数据库中创建条目,例如查找产品或添加到购物车等。 服务本身是无状态的。

如果DataAccessService具有状态,则不应为单例。 一百万个用户对于类的每个属性都将具有自己的值,而共享它在多用户/多线程环境中将是一场同步灾难。

该类的优点可能与依赖倒置有关。 如果将用于创建DataAccessService的新机制完全实现为新类,例如SubDataAccessService(extends DataAccessService),则一旦在getDataAccessService()中更新了返回类型,所有调用getDataAccessService()的类都将接收新的子类型。 这样可以避免重构所有调用的代码

 new DataAccessService() 

 new SubDataAccessService()

例如,如果DataAccessService不是无状态的,则它可以是非活动的,也可以是活动的,并且每个用户都将根据逻辑对其进行更新,那么它就不能是单例。

通常,服务没有状态,但是有处理数据并在DAO层和用户/前端之间形成桥梁的方法。 如果服务没有类级别的对象,则通过使用facotry返回新实例的逻辑不多。

这确实是依赖于实现的问题。

单例的缺点是它在内存中的生存时间很长,因为它不会像作用域末尾的常规对象那样被取消分配。

另外,如果它缓存内容或内存泄漏,它可能会使用大量内存。

另一方面,如果它可以被许多对象重用,特别是如果初始化需要花费时间(例如需要连接到数据库的DAO对象),那么这将是非常有益的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM