Moda na wzorce fabryczne wynika z niemal dogmatycznego przekonania programistów w językach „C” (C / C ++, C #, Java), że użycie słowa kluczowego „new” jest złe i należy go unikać za wszelką cenę (lub najmniej scentralizowany). To z kolei wynika z bardzo ścisłej interpretacji zasady pojedynczej odpowiedzialności („S” SOLID), a także zasady inwersji zależności („D”). Mówiąc wprost, SRP mówi, że idealnie obiekt kodu powinien mieć jeden „powód do zmiany” i tylko jeden; ten „powód zmiany” jest głównym celem tego obiektu, jego „odpowiedzialnością” w bazie kodu i wszystko, co wymaga zmiany kodu, nie powinno wymagać otwarcia tego pliku klasy. DIP jest jeszcze prostszy; obiekt kodu nigdy nie powinien być zależny od innego konkretnego obiektu,
W tym przypadku, używając „new” i konstruktora publicznego, podłączasz kod wywołujący do konkretnej metody konstrukcyjnej określonej konkretnej klasy. Twój kod musi teraz wiedzieć, że istnieje klasa MyFooObject i ma konstruktor, który pobiera ciąg i liczbę całkowitą. Jeśli ten konstruktor kiedykolwiek potrzebuje więcej informacji, wszystkie zastosowania konstruktora muszą zostać zaktualizowane, aby przekazać te informacje, w tym te, które piszesz teraz, a zatem muszą mieć coś ważnego do przekazania, więc muszą albo lub zmień, aby go zdobyć (dodając więcej obowiązków do zużywających się obiektów). Ponadto, jeśli MyFooObject zostanie kiedykolwiek zastąpiony w bazie kodu przez BetterFooObject, wszystkie zastosowania starej klasy muszą się zmienić, aby zbudować nowy obiekt zamiast starego.
Zamiast tego wszyscy konsumenci MyFooObject powinni być bezpośrednio zależni od „IFooObject”, który określa zachowanie klas implementujących, w tym MyFooObject. Teraz konsumenci IFooObjects nie mogą po prostu zbudować IFooObject (bez wiedzy, że konkretna konkretna klasa jest IFooObject, której nie potrzebują), dlatego zamiast tego muszą otrzymać instancję klasy lub metody implementującej IFooObject z zewnątrz, przez inny obiekt, który ma obowiązek wiedzieć, jak stworzyć właściwy obiekt IFooObject na okoliczność, która w naszym języku jest zwykle znana jako Fabryka.
Tutaj teoria spotyka się z rzeczywistością; obiekt nigdy nie może być cały czas zamknięty na wszystkie rodzaje zmian. W tym przypadku IFooObject jest teraz dodatkowym obiektem kodu w bazie kodu, który musi się zmieniać za każdym razem, gdy zmieni się interfejs wymagany przez konsumentów lub implementacje IFooObjects. Wprowadza to nowy poziom złożoności związany ze zmianą sposobu interakcji obiektów między sobą w ramach tej abstrakcji. Ponadto konsumenci nadal będą musieli się zmienić i głębiej, jeśli sam interfejs zostanie zastąpiony nowym.
Dobry programista wie, jak zrównoważyć YAGNI („Nie będziesz go potrzebował”) z SOLID, analizując projekt i znajdując miejsca, które najprawdopodobniej będą musiały się zmienić w określony sposób, i przefaktoryzuj je, aby były bardziej tolerancyjne na tego typu zmiany, ponieważ w tym przypadku „ty to będzie to potrzebne”.