共享对象应用程序

时间:2012-03-24 21:45:18

标签: java design-patterns

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

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

4 个答案:

答案 0 :(得分:4)

  

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

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

  

定义一个“主类”,然后设置一个成员变量并从这个“主类”扩展所有其他类的好方法

绝对不是。除了其他任何东西,如果它是实例变量,那么无论如何它都不会与其他类的实例“共享”。这也是对继承的完全滥用,在任何大规模的应用程序中肯定会让你苦苦挣扎 - 你的其他类在逻辑上与你的“主”类没有继承关系,是吗?作为一般规则,只有在非常合适的情况下才能使用继承 - 而不是实现快速修复。

  

你最喜欢的模式是什么?

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

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

  • 类本身不知道依赖项是否实际共享;为什么要关心?
  • 全球国家使单位测试更难
  • 每个类在声明它们时使其依赖关系更加清晰 - 然后更容易在应用程序中导航并查看类如何相互关联。

单身人士和全球工厂在进行日志记录等事情时更适合更多 - 但即便如此,这也意味着测试类的日志记录方面相对困难。创建一个依赖项可以更简单地创建一个依赖项,它可以满足您的需要,并将其传递给被测对象,而不是添加使用单例(通常在初始化后保持“固定”)的方法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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