Разбираюсь с абстрактными классами в java и в качестве примера их использования приводиться фабричный метод, и говориться что в данном случае мы можем не создавать именованный экземпляр класса что собственно делает синтаксис более осмысленным, вот пример кода:
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class Implementation1 implements Service{
private Implementation1(){
}
public void method1(){
System.out.println("Implementetion1 print method1");
}
public void method2(){
System.out.println("Implementetion1 print method2");
}
public static ServiceFactory factory =
new ServiceFactory(){
public Service getService(){
return new Implementation1();
}
};
}
class Implementation2 implements Service{
private Implementation2(){
}
public void method1(){
System.out.println("Implementetion2 print method1");
}
public void method2(){
System.out.println("Implementetion2 print method2");
}
public static ServiceFactory factory =
new ServiceFactory() {
@Override
public Service getService() {
return new Implementation2();
}
};
}
class Factories{
public static void serviceConsumer(ServiceFactory fact){
Service s = fact.getService();
s.method1();
s.method2();
}
}
public class AbstractClass {
public static void main(String[] arg){
Factories.serviceConsumer(Implementation1.factory);
Factories.serviceConsumer(Implementation2.factory);
}
}
Не понятно, чем это лучше на практике чем следующий код:
interface Service{
void method1();
void method2();
}
class Implementation1 implements Service{
public void method1(){
System.out.println("Implementetion1 print method1");
}
public void method2(){
System.out.println("Implementetion1 print method2");
}
}
class Implementation2 implements Service{
public void method1(){
System.out.println("Implementetion2 print method1");
}
public void method2(){
System.out.println("Implementetion2 print method2");
}
}
class Factories{
public static void serviceConsumer(Service s){
s.method1();
s.method2();
}
}
public class AbstractClass {
public static void main(String[] arg){
Factories.serviceConsumer(new Implementation1());
Factories.serviceConsumer(new Implementation2());
}
}
В первом случае в Factories.serviceConsumer мы передает конкретное поле конкретного класса, почему бы не передавать сразу объект как во втором случае, к тому же во втором случае кода нужно писать меньше.
В первом случае в Factories.serviceConsumer мы передает конкретное поле конкретного класса, почему бы не передавать сразу объект как во втором случае
Чтобы сразу передать объект, как во втором случае, нужно сначала его создать и проинициализировать, в вашем пример это просто вызов конструктора, но на практике это может быть сложная процедура, с различной логикой для различных реализаций Service
, так что если эту логику отдать клиентскому классу (AbstractClass
), то получим сильную связь между этими классами, что в дальнейшем будет дорого поддерживать.
Фабричный метод как раз позволяет делегировать создание объекта другому классу, а клиентский класс не должен ничего знать о том, как создавать тот или иной экземпляр сервиса.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Имеется Spring boot приложение, которое перегоняет большое количество данных получаемых по API в удаленную БД (MySQL)В качестве пула соединений использую...
Почему нельзя в интерфейсе задать сигнатуру конструктора без реализации?
Уже неделю голову ломаю, вроде всё так и всё на месте, но что-то не вижу, подскажите, пожалуйста, что не учёл
Начал осваивать сервлеты и столкнулся с таким вопросом Файлы jsp лежат в папке web Можно ли их вынести в папку src например? И стоит ли во вьюшку...