Скажем, у меня есть объект с именем 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
вместо этого?
Благодарю.
Я считаю, что вы ищете что-то вроде шаблона 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
создается и возвращается.
Вы ищете что-то, называемое шаблоном 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", чтобы найти больше.
apple2
, и я хочу, чтобы у него тоже был свой AppleHolder. Паттерн Синглтон не может быть идеальным для этого случая.