the standard java way to solve this is the service loader pattern. java 6 has explicit support in the serviceloader class, but it is easy to use classloader.getResources(...) note that's a plural, to roll your own if you need to support java 5 or earlier.
basically the factory looks for files called /META-INF/services/fullyqualifiedinterfaceclassname those files contain the name(s) of implementations of the interface. no circular dependency required. a more modern solution is to use dependency injection so that the implementations have eg @Producers. this is effectively the same as serviceloader but can be more flexible - Stephen --- Sent from my Android phone, so random spelling mistakes, random nonsense words and other nonsense are a direct result of using swype to type on the screen On 7 Jan 2012 04:24, "oweijr oweirj" <[email protected]> wrote: > I have a set of interfaces and then multiple > implementations of the interfaces. Only one implementation is used in a > given instance of the application. > I'm trying to create separate > projects for the common interface and each of the implementations. > However, the problem I have is that in order to implement the common > interface, each of the implementation projects needs to depend on the > common interface project. I also need to create a factory method somewhere > which will return the appropriate version of the implementation based on > some parameters. It seems logical to put this factory into the common > project. However, I cannot do this because the implementation projects > depend on the common one and this creates a circular dependency in maven. > How does one typically solve this sort of problem. I could create yet > another project which contains the factory and depends on all the other > projects. Is there a more sensible way? > <parent> +--- <common-interface> +--- <implementation-1> -> depends on > common-interface +--- <implementation-2> -> depends on common-interface > Where does the factory go? It depends on all 3 of the above. > TIA
