The startup process/logic should be separate from the runtime logic.
For objects that will be created while the program is already initialized and running, we can use an abstract factory
Dependency Injection - an object should not be responsible for creating its required dependencies - instead they should be injected into the object by an outside authority.
"An optimal system architecture consists of modularized domains of concern, each of which is implemented with Plain Old Java (or other) Objects. The different domains are integrated together with minimally invasive Aspects or Aspect-like tools. This architecture can be test-driven, just like the code."
Obviously the book is Java oriented, but the idea is there.