Phiên bản mẫu của Factory xuất phát từ niềm tin gần như giáo điều của các lập trình viên trong các ngôn ngữ "kiểu C" (C / C ++, C #, Java) sử dụng từ khóa "mới" là xấu và nên tránh bằng mọi giá (hoặc tại ít tập trung nhất). Đến lượt nó, xuất phát từ một cách giải thích cực kỳ nghiêm ngặt về Nguyên tắc Trách nhiệm duy nhất ("S" của RẮN), và cả Nguyên tắc đảo ngược phụ thuộc ("D"). Nói một cách đơn giản, SRP nói rằng lý tưởng là một đối tượng mã nên có một "lý do để thay đổi" và chỉ một lý do; rằng "lý do để thay đổi" là mục đích trung tâm của đối tượng đó, "trách nhiệm" của nó trong cơ sở mã và bất kỳ điều gì khác yêu cầu thay đổi mã không nên yêu cầu mở tệp lớp đó. DIP thậm chí còn đơn giản hơn; một đối tượng mã không bao giờ nên phụ thuộc vào một đối tượng cụ thể khác,
Trong trường hợp, bằng cách sử dụng "mới" và một nhà xây dựng công cộng, bạn đang ghép mã gọi với một phương thức xây dựng cụ thể của một lớp bê tông cụ thể. Mã của bạn bây giờ phải biết rằng một lớp MyFooObject tồn tại và có một hàm tạo có một chuỗi và một int. Nếu nhà xây dựng đó cần thêm thông tin, tất cả các cách sử dụng của nhà xây dựng phải được cập nhật để chuyển thông tin đó bao gồm thông tin bạn đang viết bây giờ, và do đó họ bắt buộc phải có một cái gì đó hợp lệ để truyền vào, và vì vậy họ phải có nó hoặc được thay đổi để có được nó (thêm nhiều trách nhiệm hơn cho các đối tượng tiêu thụ). Ngoài ra, nếu MyFooObject được thay thế trong cơ sở mã bởi BetterFooObject, tất cả các cách sử dụng của lớp cũ phải thay đổi để xây dựng đối tượng mới thay vì đối tượng cũ.
Vì vậy, thay vào đó, tất cả người tiêu dùng MyFooObject nên phụ thuộc trực tiếp vào "IFooObject", định nghĩa hành vi triển khai các lớp bao gồm MyFooObject. Bây giờ, người tiêu dùng IFooObject không thể chỉ xây dựng IFooObject (mà không có kiến thức rằng một lớp cụ thể cụ thể là IFooObject, mà họ không cần), vì vậy thay vào đó họ phải được cung cấp một thể hiện của lớp hoặc phương thức triển khai IFooObject từ bên ngoài, bởi một đối tượng khác có trách nhiệm biết cách tạo IFooObject chính xác cho trường hợp, theo cách nói của chúng tôi thường được gọi là Nhà máy.
Bây giờ, đây là nơi lý thuyết đáp ứng thực tế; một đối tượng không bao giờ có thể bị đóng đối với tất cả các loại thay đổi mọi lúc. Trường hợp cụ thể, IFooObject hiện là một đối tượng mã bổ sung trong cơ sở mã, phải thay đổi bất cứ khi nào giao diện được yêu cầu bởi người tiêu dùng hoặc việc triển khai IFooObject thay đổi. Điều đó giới thiệu một mức độ phức tạp mới liên quan đến việc thay đổi cách các đối tượng tương tác với nhau trong sự trừu tượng hóa này. Ngoài ra, người tiêu dùng vẫn sẽ phải thay đổi, và sâu sắc hơn, nếu bản thân giao diện được thay thế bằng một giao diện mới.
Một lập trình viên giỏi biết cách cân bằng YAGNI ("Bạn không cần nó") với RẮN, bằng cách phân tích thiết kế và tìm những nơi rất có khả năng phải thay đổi theo một cách cụ thể và tái cấu trúc chúng để trở nên khoan dung hơn rằng loại thay đổi, bởi vì trong trường hợp đó "bạn là sẽ cần đến nó".