Как обеспечить непосредственную ссылку на объект при создании экземпляра?

1

Скажем, у меня есть объект с именем 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 вместо этого?

Благодарю.

Теги:
design-patterns

2 ответа

1
Лучший ответ

Я считаю, что вы ищете что-то вроде шаблона Singleton, ограничивая только связь между объектами, а не их экземпляр.

Модифицированный к вашему прецеденту (при условии AppleHolder отношения между Apple и AppleHolder), он будет выглядеть примерно так:

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 может иметь только один AppleHolder и AppleHolder может иметь только один Apple.

Вместо вызова конструктора для AppleHolder вы вызываете статический метод: AppleHolder.getAppleHolder(apple); ,

Если AppleHolder уже существует для Apple, при условии, то AppleHolder для этого Apple, возвращается.

Else, новый AppleHolder создается и возвращается.

  • 0
    Это имеет смысл. Спасибо!
1

Вы ищете что-то, называемое шаблоном Singleton.

Обычно вам нужен вспомогательный метод, чтобы получить экземпляр и не выполнять его с помощью конструктора.

Например:

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;
    }
}

Синхронизированное ключевое слово помогает гарантировать, что не будет проблем с параллелизмом, и ваш конструктор может делать все, что вы хотите для экземпляра singleton.

Есть и другие способы справиться с этим и книга Джошуа Блоха. Эффективная Java хорошо обсуждает ее, и вы можете выполнить поиск в Интернете по "Шаблон Singleton", чтобы найти больше.

  • 0
    Спасибо, но что, если у меня есть другой объект Apple, скажем, apple2 , и я хочу, чтобы у него тоже был свой AppleHolder. Паттерн Синглтон не может быть идеальным для этого случая.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню