如何在实例化时强制执行一对一的对象引用?

时间:2014-03-17 04:24:09

标签: java design-patterns

假设我有一个名为apple的对象

Apple apple = new Apple();

我有一个名为AppleHolder的课程,如下所示:

class AppleHolder{
   private Apple apple;

   public AppleHolder(Apple apple){
      this.apple = apple;
   }
}

Apple个实例不能超过1个AppleHolder。但是,当然,当我这样做时:

AppleHolder appleHolder1 = new AppleHolder(apple);
AppleHolder appleHolder2 = new AppleHolder(apple);

这会使apple看起来好像有两个持有者只有1个。是否有设计模式使第二个实例化返回appleHolder1而不是?

感谢。

2 个答案:

答案 0 :(得分:1)

你正在寻找一种叫做单身人士模式的东西。

通常,您需要一个辅助方法来获取实例,而不是使用构造函数。

例如:

class AppleHolder {
    static private AppleHolder apple = null;
    // prevent any object construction outside of this class
    private AppleHolder() {
    }
    public synchronized AppleHolder getInstance() {
        if (null == apple) {
            apple = new AppleHolder();
        }
        return apple;
    }
}

synchronized关键字有助于确保不存在任何并发问题 并且你的构造函数可以为单例实例做任何你想做的事。

还有其他方法可以解决这个问题,Joshua Bloch的书 Effective Java 围绕它进行了一些很好的讨论,你可以在" Singleton Pattern"上进行网络搜索。找到更多。

答案 1 :(得分:1)

我相信你正在寻找类似Singleton模式的东西,只限制对象之间的关系,而不是实例化。

修改为您的用例(假设AppleAppleHolder之间存在一对一的关系),它看起来像:

class Apple {
    private AppleHolder appleHolder;

    public AppleHolder getAppleHolder() {
        return this.appleHolder;
    } 

    // Rest of class...
}

class AppleHolder {
    private Apple apple;

    private AppleHolder(Apple apple) {
        this.apple = apple;
    }

    public static AppleHolder getAppleHolder(Apple apple) {
        if(apple.getAppleHolder() != null) {
            return apple.getAppleHolder();
        } else {
            return new AppleHolder(apple);
        }
    }
}

在上面的代码中,Apple只能有一个AppleHolderAppleHolder只能有一个Apple

不是调用AppleHolder的构造函数,而是调用静态方法:AppleHolder.getAppleHolder(apple);

如果提供的AppleHolder已存在Apple,则会返回该AppleHolder的{​​{1}}。

否则,会创建并返回新的Apple