Является ли статический метод getByname класса InetAddress в java примером шаблона метода Factory? - PullRequest
1 голос
/ 26 декабря 2011

Стандартный фабричный метод проектирования шаблонов разговоров из 4 классов. Создатель, Продукт и их конкретные реализации.

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

Но я также видел сценарии, в которых люди объявляют конструктор как закрытый и имеют статический метод, который создает объект того же класса. Нечто похожее на то, что мы делаем с синглетами.

Например, getByname является одним из статических методов InetAddress, который возвращает один из его подклассов в зависимости от того, что является параметром. и люди называют это фабричным методом.

Это также пример шаблона фабричного метода? он содержит if-else-if внутри метода для декодирования параметра или оператора switch? Но разве использование условных операторов switch n не считается плохой практикой проектирования ОО?

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Да, это пример шаблона фабричного метода.

И да, он анализирует свой аргумент и решает, какой тип адреса (какой подкласс) создать (это легко найти, посмотрев на исходный код метода, который поставляется с JDK).

В какой-то момент вы должны использовать условные операторы. Это не обязательно плохая практика. В этом случае именно фабричный метод предназначен для инкапсуляции парсинга адреса и возврата соответствующего подкласса, вместо того, чтобы делать это в вызывающей программе. Что было бы плохой практикой ОО, было бы вынуждено написать:

int addressType = InetAddress.getAddressType(address);
InetAddress ia = null;
switch (addressType) {
    case V4 : 
        ia = new Inet4Address();
        break;
    case V6 : 
        ia = new Inet6Address();
        break;
    default :
        throw new RuntimeException("bad address");
}

Вместо этого эта логика заключена в фабричном методе.

1 голос
/ 26 декабря 2011

На самом деле это пример абстрактного фабричного шаблона . Мы знаем, что это абстрактная версия шаблона, поскольку возвращаемый тип является абстрактным (вы можете получить либо Inet4Address, либо Inet6Address)

При таком шаблоне условные операторы (if s) неизбежны и должны куда-то идти, так что все в порядке. «Дизайнерские нацисты» могут прыгать.

0 голосов
/ 26 декабря 2011

За счет хорошего дизайна часто можно избежать переключателей, но иногда нет другого выбора. Нравится анализировать ввод, который был вставлен извне системы (в основном, пользователями). Но для ввода, который поступает из вашей собственной системы, вы должны рассмотреть лучший дизайн или метод для каждого вида ввода (если возможно).

Например, в этом случае, если вы знаете, имеете ли вы дело с адресом IPv4 или IPv6, вы должны иметь возможность вызвать соответствующий метод вместо того, чтобы идти на завод. Было бы плохо проектировать, если бы был доступен только фабричный метод.

...