2012-03-24 49 views
1

在应用程序范围内使用对象很常见。 通过应用程序共享对象有哪些不同的模式/模型/方法?在应用程序范围内共享对象

是定义一个“主类”,然后设置一个成员变量,并从这个“主类”扩展所有其他类是一个好方法?创建一个静态类可能是更好更清洁的方式?你最喜欢的模式是什么?

回答

4

在应用范围内使用对象是很常见的。通过应用程序共享对象的不同模式/模型/方式有哪些?

一个常见的方法是使用单例模式。但我会避免这种情况。

是定义一个“主类”,然后设置一个成员变量,并从该“主类”的好办法

绝对不延长所有其他类。除了其他任何东西,如果它是一个实例变量,那么它将不会与其他类的实例“共享”。这也是一个完全的继承滥用,这肯定会让你在任何显着大小的应用程序中遇到困难 - 你的其他类在逻辑上与你的“主”类没有继承关系,他们会吗?作为一般规则,继承只能在真正适用时才使用 - 而不是快速修复。

你最喜欢什么模式?

依赖注入。当你的应用程序启动时,创建所有需要了解彼此的适当对象,并告诉它们(通常在构造函数中)关于它们的依赖关系。如果合适的话,几个不同的对象都可以依赖于同一个对象。您可以使用其中的一个许多可用的依赖注入框架轻松实现此目的。

依赖注入通常工作比使用单件更好,因为:

  • 类本身不知道的依赖是否是实际上共享;为什么要关心?
  • 全球状态使得单元测试更难
  • 每类使得其更清楚地依赖他们声明时 - 它是那么容易导航在应用程序中,看到了类如何相互关联的。

单身和全球的工厂都在适当的时候他们喜欢的事情记录 - 但即使如此,这意味着它是比较难以测试类的记录方面。创建一个依赖关系可以很简单地完成你所需要的工作,并将它传递给被测试的对象,而不是添加一些单例(通常在初始化后仍然是“固定的”)。

+0

我很好奇为什么应该避免单例模式 – 2012-03-24 21:49:21

+0

@KshitijMehta:刚刚添加了这个 - 主要是为了可测试性。 – 2012-03-24 21:51:54

+0

有没有你会使用单例模式的情况?您如何权衡在项目中包含DI框架所需的额外工作? – 2012-03-24 21:55:43

0

Singleton pattern,AFAIK是软件工程中的优选方式。

+0

更喜欢什么?虐待继承?是。优先于DI? IMO很少。 – 2012-03-24 21:58:03

1

如果您使用像Spring这样的依赖注入框架,您可以免费获得“全局”对象的所有好处,而无需明确定义它们。您只需在您的应用程序上下文中创建对它们的引用,并且可以将它们注入到您想要的任何对象中,而无需担心同步问题。

0

我相信你正在寻找的是Singleton模式。通过这种模式,可以确保只有一个类的实例可以在内存中创建。

例子:

public class mySingletonClass { 

    private static mySingletonClass singleObject; 

    // Note that the constructor is private to prevent more than one 
    //instance of the class 
    private SingletonObjectDemo() { 
     // Optional Code 
    } 

    public static mySingletonClass getSingletonObject() { 
     if (singleObject == null) { 
      singleObject = new mySingletonClass(); 
     } 
     return singleObject; 
    } 
} 

这就是说,你应该尽量避免使用它;但有一些可接受的情况,one of which is here