Witam,
Mam do rozwiązania pewne zadanie, które sprawia mi sporo problemów, bo nie wiem jak je rozwiązać, aby było jak najbardziej poprawne i zgodne ze wzorcami projektowania. Na wstępie zaznaczę, że wiem co to Singleton/Multiton i potrafię się nimi posługiwać, ale jak widać po tym zadaniu poniżej, nie potrafię zastosować tej wiedzy w zadaniach praktycznych, a więc do rzeczy...
Treść zadania:
Baza danych (tablica znaków) umożliwia dostęp jedynie przez klasę implementującą typ interfejsowy IPolaczenie. Baza danych powinna być **Singletonem ** ale jej klientem nie będzie funkcja **main ** (nie można pobrać z niej bezpośrednio referencji do bazy) tylko obiekt konkretnego połączenia. Z kolei konkretne połączenia będą **Multitonami ** (istnieją tylko 3, udostępniane naprzemiennie - 1 2 3 1 2 3 ..., obiekty je klasy), których klientem będzie Baza, a dokładniej jej metoda getPolaczenie.
Klient (funkcja main) pobiera obiekty połączenia i za ich pomocą korzysta z bazy.
Uzupełnij poniższy kod , a w funkcji **main ** pobierz 4 połączenia i pokaż, że wszystkie korzystają z tej samej bazy. Wykaż też, że obiekty połączeń są współdzielone.
Kod, który muszę uzupełnić:
interface IPolaczenie {
char get(int indeks);
void set(int indeks, char c);
int length();
}
class Baza {
private char[] tab = new char[100]; /* ... */
public static IPolaczenie getPolaczenie() {
return Polaczenie.getInstance();
}
private static class Polaczenie implements IPolaczenie {
private Baza baza; /* ... */
public static IPolaczenie getInstance() {
/* ... */
}
public char get(int indeks) {
return baza.tab[indeks];
}
public void set(int indeks, char c) {
baza.tab[indeks] = c;
}
public int length() {
return baza.tab.length;
}
}
}
A tutaj moje rozwiązanie, nie pełne:
public interface IPolaczenie {
char get(int indeks);
void set(int indeks, char c);
int length();
}
public class Baza {
private char[] tab = new char[100];
public static IPolaczenie getPolaczenie() {
return Polaczenie.getInstance();
}
private static class Polaczenie implements IPolaczenie {
private Baza baza;
public String connectionName;
private static Polaczenie[] polaczenia = {
new Polaczenie("1"),
new Polaczenie("2"),
new Polaczenie("3")
};
private static int kolejnosc = 0;
private Polaczenie() { }
private Polaczenie(String str) { this.connectionName = str; }
public static IPolaczenie getInstance() {
kolejnosc = (kolejnosc + 1) % polaczenia.length;
return polaczenia[kolejnosc];
}
public char get(int indeks) {
return baza.tab[indeks];
}
public void set(int indeks, char c) {
baza.tab[indeks] = c;
}
public int length() {
return baza.tab.length;
}
}
}
public class BazaTest {
public static void main(String[] args) {
Baza baza = new Baza();
IPolaczenie polaczenie1 = Baza.getPolaczenie();
IPolaczenie polaczenie2 = Baza.getPolaczenie();
IPolaczenie polaczenie3 = Baza.getPolaczenie();
IPolaczenie polaczenie4 = Baza.getPolaczenie();
}
}
Co z referencją do obiektu baza ("private Baza baza;") ?
Robiąc nowe połączenie, robię cały czas nowe obiekty ze wspomnianą składową, która nie odnosi się do niczego.
Czy powinienem w tym miejscu zrobić funkcję getBaza(), która zwróci mi jeden-jedyny obiekt klasy Baza - zgodnie z treścią zadania ?!
Kolejna moja wątpliwość to te zdanie z treści zadania "Wykaż też, że obiekty połączeń są współdzielone.", czyli że co w tym przypadku, bo nie mam pojęcia do czego to zdanie się odnosi ?
Inny problem to taki jak się dostać do prywatnej zmiennej tab ("private char[] tab = new char[100];") ? Bo aktualna wersja tj. metody get/set tego nie umożliwiają ? Zmienić na protected/public czy jest jakiś inny sposób dla wzorców ?
Na koniec chciałbym się jeszcze odnieść do tego zdania z treści zadania: "Uzupełnij poniższy kod , a w funkcji main pobierz 4 połączenia i pokaż, że wszystkie korzystają z tej samej bazy.". Czyli moja teza dot. zrobienia metody getBaza() w klasie Baza by się chyba sprawdziła i wtedy mógłbym zamienić "private Baza baza;" na "private Baza baza = Baza.getBaza();". Właśnie nie rozumiem po kiego są wstawione te komentarze, może po to żeby pokazać, że tam należy wprowadzić jakieś zmiany ?! :)
Proszę bardzo o pomoc,
Pozdrawiam JerzyKol