Фабрика модельних моделей випливає з майже догматичної віри серед кодерів в мовах "стилю С" (C / C ++, C #, Java), що використання "нового" ключового слова є поганим, і його слід уникати будь-якою ціною (або за будь-яку ціну найменш централізовані). Це, у свою чергу, випливає з надто суворої інтерпретації Принципу єдиної відповідальності ("S" SOLID), а також принципу інверсії залежності ("D"). Простіше кажучи, SRP говорить, що в ідеалі кодовий об'єкт повинен мати одну "причину для зміни", і лише одну; що "причина зміни" є основною метою цього об'єкта, його "відповідальністю" в кодовій базі, і будь-що інше, що вимагає зміни коду, не повинно вимагати відкриття файлу класу. DIP ще простіший; об'єкт коду ніколи не повинен залежати від іншого конкретного об'єкта,
Справа в конкретному випадку, використовуючи "новий" і загальнодоступний конструктор, ви з'єднуєте код виклику з конкретним методом побудови конкретного класу конкретних. Тепер ваш код повинен знати, що клас MyFooObject існує і має конструктор, який приймає рядок і int. Якщо цьому конструктору коли-небудь потрібна додаткова інформація, усі звички конструктора повинні бути оновлені, щоб передати цю інформацію, включаючи ту, яку ви зараз пишете, і тому вони повинні мати щось дійсне для передачі, і тому вони повинні або мати його або бути зміненим, щоб отримати його (додавши більше обов'язків до споживаючих об'єктів). Крім того, якщо MyFooObject коли-небудь замінюється в кодовій базі на BetterFooObject, всі звички старого класу повинні змінитися, щоб сконструювати новий об'єкт замість старого.
Отже, натомість усі споживачі MyFooObject повинні бути безпосередньо залежні від "IFooObject", який визначає поведінку впроваджуючих класів, включаючи MyFooObject. Тепер споживачі IFooObjects не можуть просто побудувати IFooObject (не маючи знання про те, що конкретний конкретний клас є IFooObject, який їм не потрібен), тому натомість їм слід надати примірник класу чи методу, що реалізує IFooObject. ззовні, іншим об'єктом, який несе відповідальність за знання того, як створити правильний IFooObject для тієї обставини, яка на нашому мові зазвичай називається Фабрикою.
Тепер ось теорія відповідає дійсності; об'єкт ніколи не може бути закритий для всіх типів змін. Справа в тому, IFooObject тепер є додатковим кодовим об'єктом у кодовій базі, який повинен змінюватися щоразу, коли інтерфейс, необхідний споживачам або реалізація IFooObjects, змінюється. Це вводить новий рівень складності, пов'язаний із зміною способу взаємодії об'єктів один з одним у цій абстракції. Крім того, споживачам доведеться все-таки змінитись і ще глибше, якщо сам інтерфейс буде замінений на новий.
Хороший кодер знає, як збалансувати YAGNI ("Вам це не знадобиться") з SOLID, проаналізувавши дизайн та знайди місця, які, ймовірно, повинні змінитися певним чином, і переробляти їх на більш толерантність до такий тип змін, тому що в такому випадку "вам це знадобиться".