If your intent is to decouple an abstraction from its implementation, you may use a bridge pattern:
- your abstraction is the module interface. Consumer of your module know only this one.
- your actual implementation may have a slightly different interface (e.g. richer interface, or only building blocks and utilities, etc).
- your abstraction can be derived further, completely independently of its implementation.
- different concrete implementation could be used to implement the module, without having any effect on the abstraction and its dervates
I'm not sure that this is what you are looking for, or if this is overkill and you were looking simply for a facade to offer a public API to a well encapsulated private implementationprivate implementation