2017-01-23 5 views
0

У меня есть пакет домена, который имеет интерфейс под названием MyInterface. У меня также есть фабричный класс MyFactory, который должен помочь в создании экземпляров классов, которые реализуют MyInterface, во время выполнения.Какой объект или класс передать в Factory методе в пакете объектов, возвращающем объекты уровня сервиса?

домена Layer

interface MyInterface{ 
    //some Domain specific methods here 
} 

class MyFactory{ 
    public static MyInterface getInstance(Object resource) { 

    // return MyInterfaceImpl instance via the methods 
    // this Object can also be a Class argument, where I do 
    // Class.forName("").newInstance(); but this is a bad design. 
} 


class DomainServiceImpl { 
    public void domainMethod(Object res) { 
     MyInterface i = MyFactory.getInstance(res); 
    } 
} 

Сервис слой

class Class1 implements MyInterface { 

} 

class Class2 implements MyInterface { 

} 

class ServiceClass { 
    public void service() { 
     domainServiceImpl.domainMethod(Object res); 
    } 
} 

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

Опции: можно использовать отражения, но не знаете, как это сделать.

+0

Что такое «правильный имп»? Когда и на основе каких критериев это решение будет принято? – guillaume31

+0

Предположим, что у меня разные версии ресурсов, и у меня есть один имп для каждой версии, тогда я хотел бы создать экземпляр правильной версии для этой версии ресурса. – user2340345

+0

Где 'ServiceClass.service()' получить ресурс? Вы имеете в виду версию, как в версиях вашего исходного кода в разные моменты времени? – guillaume31

ответ

0

Итак, как мне написать свой фабричный метод на уровне домена, чтобы получить правильный экземпляр уровня сервиса, не используя if/else или switch и избегая циклических зависимостей.

Концепция, которую вы ищете, называется «Инъекция зависимостей». Misko Hevery опубликовал множество доступных материалов по этому вопросу.

В области слоя, можно определить интерфейсы для поставщиковуслуг и внедрить эти поставщики услуг в ваши реализации через конструктор

interface MyFactory { 
    public MyInterface getInstance(Object resource); 
} 

class DomainServiceImpl { 
    final MyFactory factory; 

    // "Dependency Injection" 
    public DomainServiceImpl(MyFactory factory) { 
     this.factory = factory 
    } 

    public void domainMethod(Object res) { 
     MyInterface i = MyFactory.getInstance(res); 
    } 
} 

Затем с внешней стороны, вы можете реализовать на завод, что вам нужно.

class Class1MyFactory implements MyFactory { 
    public MyInterface getInstance() { 
     return ...; 
    } 
} 

и внедрить его в соответствующей точке в службе

class ServiceClass { 
    final domainServiceImpl; 

    public ServiceClass(DomainServiceImpl domainServiceImpl) { 
     this.domainServiceImpl = domainServiceImpl; 
    } 

    public void service() { 
     domainServiceImpl.domainMethod(Object res); 
    } 
} 

Поэтому, когда пришло время, чтобы построить сервис, вы выбираете зависимости и прочь вы идете ....

MyFactory myFactory = new Class1MyFactory(...); 
DomainServiceImpl domainServiceImpl = new DomainServiceImpl(myFactory) 
ServiceClass service = new ServiceClass(domainServiceImple) 
Смежные вопросы