Однако для использования фабрики вам нужен объект G e n e r i c F a c t o r y l < T , U>: // И н с т а н ц и р у е м с Т = S t u d e n t , U = s t r i n g
|
|
|
|
G e n e r i c F a c t o r y l < S t u d e n t , |
s t r i n g > f a c t l = |
|
new |
G e n e r i c F a c t o r y l < S t u d e n t , s t r i n g > ( ) ; |
Вам также необходим метод C r e a t e () |
этой фабрики для получения объектов с ус |
тановленным именем: |
|
// И с п о л ь з о в а н и е с т р о к о в о г о а р г у м е н т а |
students |
[1] = |
f a c t l . C r e a t e ( " R i c h a r d C o r e y " ) ; |
Вот что происходит внутри метода G e n e r i c F a c t o r y l < T , U> . C r e a t e ( ) : |
public T |
C r e a t e (U u) |
|
{
T t = new T(); // Как и ранее, параметры конструктору / / н е п е р е д а ю т с я
t . S e t P a r a m e t e r ( u ) ; / / И с п о л ь з у е т с я м е т о д , п р е д о с т а в л е н н ы й / / при р е а л и з а ц и и I S e t t a b l e
return t;
}
Поскольку C r e a t e () может создавать только объекты без параметров, вы исполь зуете метод S e t P a r a m e t e r () для передачи параметра и объекту t. После этого можно вернуть объект S t u d e n t с установленным членом и м е н и — такой же, как если бы для его создания был вызван конструктор с одним параметром. Вы знаете, что тип Т имеет
метод S e t P a r a m e t e r () из-за ограничений, накладываемых |
на класс S t u d e n t : |
: I S e t t a b l e < s t r i n g > . Этот интерфейс гарантирует, что класс |
S t u d e n t имеет метод |
SetParameter ( ) . |
|
Обсуждение решения
Насколько хорошее решение получено? Да, оно не является лучшим из тех, кото рые вы видели в своей практике. По сути, это обходной путь, но он приводит нас туда, куда нужно!
Но что делать, если конструктор объекта требует двух параметров? трех или че тырех? Увы, I S e t t a b l e < U > годится только для конструктора с одним параметром. В случае двух параметров вы должны добавить интерфейс I S e t t a b l e 2 < U , V>. Для трех — интерфейс I S e t t a b l e 3 < U , V, W> и т.д. Кроме того, для каждого из этих типов потребуется своя фабрика. Хорошая новость только в том, что крайне редко встречаются конструкторы более чем с пятью-шестью параметрами. Это и определяет, сколько ин терфейсов I S e t t a b l e < U , V , . . . > и фабрик вам понадобится.
Конечно, при желании класс может реализовывать как интерфейс I S e t t a b l e < U > , так и I S e t t a b l e 2 < U , V > . В этом случае вам потребуется реализовать как метод S e t P a r a m e t e r (U и ) , так и метод S e t P a r a m e t e r (U u,V v ) . ( Э т о — пере грузка, поскольку два метода S e t P a r a m e t e r () имеют разные сигнатуры.)