Daniel Hiller OTOH in my experience you seldom need more than one concrete implementation, and if you do, you have a strategy and their implementations. I disagree. You are right, interfaces are often designed in "service" way, and usually implemented once or twice, but IMO it is severe mistake. Interface is meaningless if it is designed for just a few implementations. Only the interfaces which has potentially infinite number of implementations truly enable OCP. For example: interface Light { void on ( ) ; void off ( ) ; } Interface Light from example. It can have plenty of implementations, which are able to turn on and off smart lights from different vendors. Also, it can be implemented as a fake object for test purposes. It can have composite implementation, which enable management of group of lights in one shot. Any customer's demand related to turning on and off the lights can be implemented behind this interface. Such characteristic is achieved because Light is completely purified from technical details. It is true stable abstraction, the one that is always safe to depend on. In such curcumstances, if all interfaces in a system are designed with this consideration in mind, the strategy pattern, spring profiles and autowired injections become really crooked and inflexible.