DIP 의 아이디어 자체만 보면 비현실적 입니다.
대부분의 언어가 concrete object 를 생성하기 위해서는 직접적인 의존성이 필요하기 때문입니다.
여기서, 의존하지 않는 대상을 <변동성이 큰 구체적인 요소> 로 보는게 맞습니다.(예) 기본타입 (String), 운영체제, 플랫폼 등은 안정성이 보장된 항목이니 의존을 허용합니다.
변동성이 큰 구체 객체를 생성할 때 주의해야 합니다. 객체를 생성하려면 기 정의된 구체 클래스에 대해서 소스코드 의존성이 발생하기 때문입니다.
하단의 Abstract Factory 패턴의 경우, 생성을 위한 인터페이스를 두면서 소스코드의 의존성이 모두 한 방향을 (추상적인 쪽으로) 향하도록 만들 수 있습니다.
구체 컴포넌트에 DIP 를 위반하는 구간이 있지만, 모두 없을 수는 없는 필수적인 요소로 볼 수 있습니다. 단, DIP 를 위반하는 클래스를 하나의 구체 컴포넌트에 모아둘 수 있어서 나쁘지 않은 선택입니다.