API designers might know the struggle: you have a package defining the public API as interfaces and then you have another package containing the implementation. How do you make the implementation accessible to the outside but also restrict unwanted instantiations?
Forbidding unwanted usage of your API actually makes it easier to use because it is harder to be used the wrong way.
Let's look at this simple example and start with a public service interface: