eugene_leshchinskiy
@eugene_leshchinskiy

Как правильно разработать интерфейс и фабрику?

Всем привет. Есть интерфейс
public interface AuthorizationService {
    void send(User user) throws IOException;

    Respond getRespond() throws IOException, ClassNotFoundException;

    ObjectOutputStream getOut();

    void setOut(ObjectOutputStream out);

    ObjectInputStream getIn();

   void setIn(ObjectInputStream in);
}

Его реализует класс
package com.eleshchinskiy.service.impl;

import com.eleshchinskiy.service.AuthorizationService;
import com.eleshchinskiy.service.bean.Respond;
import com.eleshchinskiy.service.bean.real.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class AuthorizationServiceImpl implements AuthorizationService {
    private ObjectOutputStream out;
    private ObjectInputStream in;

    public AuthorizationServiceImpl(){
    }

    @Override
    public void send(User user) throws IOException {
        out.writeObject(user);
        out.flush();
    }

    @Override
    public Respond getRespond() throws IOException, ClassNotFoundException {
        return (Respond) in.readObject();
    }

    @Override
    public ObjectOutputStream getOut() {
        return out;
    }

    @Override
    public void setOut(ObjectOutputStream out) {
        this.out = out;
    }

    @Override
    public ObjectInputStream getIn() {
        return in;
    }

    @Override
    public void setIn(ObjectInputStream in) {
        this.in = in;
    }
}


Этот объект можно получить в фабрике
package com.eleshchinskiy.service.factory;

import com.eleshchinskiy.service.AdminMenuService;
import com.eleshchinskiy.service.AuthorizationService;
import com.eleshchinskiy.service.UserMenuService;
import com.eleshchinskiy.service.impl.AdminMenuServiceImpl;
import com.eleshchinskiy.service.impl.AuthorizationServiceImpl;
import com.eleshchinskiy.service.impl.UserMenuServiceImpl;

public class ServiceFactory {
    private static final ServiceFactory instance = new ServiceFactory();

    private AuthorizationService authorizationService = new AuthorizationServiceImpl();
    private UserMenuService userMenuService = new UserMenuServiceImpl();
    private AdminMenuService adminMenuService = new AdminMenuServiceImpl();

    private ServiceFactory() {
    }

    public AuthorizationService getAuthorizationService() {
        return authorizationService;
    }

    public UserMenuService getUserMenuService() {
        return userMenuService;
    }

    public AdminMenuService getAdminMenuService() {
        return adminMenuService;
    }

    public static ServiceFactory getInstance() {
        return instance;
    }
}


Все вроде бы отлично, но в интерфейсе нельзя прописывать геттеры и сеттеры. Однако если я этого не сделаю, то когда получу объект типа интерфейс, то не смогу установить/получить его поля. Как это решается?
  • Вопрос задан
  • 276 просмотров
Пригласить эксперта
Ответы на вопрос 1
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Фабрика выглядит так.
public interface Service {}
public class AuthorizationService implements Service {}
public class UserMenuService implements Service {}
public class AdminMenuService implements Service {}

public class ServiceFactory {
    public static final int AUTHORIZATION = 1;
    public static final int USERMENU = 2;
    public static final int ADMINMENU = 3;

    public static Service create(int id) throws Exception {
        switch (id) {
            case AUTHORIZATION: return new AuthorizationService();
            case USERMENU: return new UserMenuService();
            case ADMINMENU: return new AdminMenuService();
            default: throw new Exception("service factory wrong id:" + id);
        }
    }
}


Потом работаете по общим методам объявленным в интерфейсе. Когда нужны конкретные методы реализации, то используется instanceof. Если instanceof используется слишком часто, то интерфейс и фабрика лишние абстракции.

Может нужен builder, а может нужна абстрактная фабрика, а может 3 отдельные фабрики.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы