Фабрика класу в c # - stack overflow російською

Це не повноцінний відповідь, я просто наведу кілька прикладів, в яких з цього можна отримати користь. Справжня відповідь напевно хтось дасть пізніше; пошу вибачення за огріхи в синтаксисі, якщо такі будуть

Наприклад, якщо у нас є такий шматок коду:

То в ньому не тільки намертво прибитий конкретний клас, а й сам екземпляр цього класу генерується на льоту, а значить, runProcess () не можна повноцінно протестувати - при спробах його протестувати доведеться озиратися на работспособность Process. і непрацездатність Process завалить два тести разом. Фабрика дозволяє кардинально вплинути на жорстку залежність навіть зі збереженням точного використовуваного класу:

У цьому випадку сама генерація об'єкта виноситься за межі класу, і можна зробити мок (підробку) ProcessFactory. яка завжди буде повертати екземпляр, що працює так, ніби він і справді успішно запускає процес. Саму ProcessFactory при тому тестувати не потрібно - там всього одна однозначна рядок.

Крім того, фабрика відокремлює створення екземпляра класу від місця виклику. Це дозволяє реалізувати додатковий функціонал, наприклад, шаблони Builder, Flyweight:

В даному прикладі зовнішній код може більше не піклуватися про ініціалізації екземпляра класу, тому що фабрика поєднує в собі шаблон Builder.

Це застосовується коли є спадкоємці має схожий функціонал, але з деяких причин створення цих спадкоємців через конструктор не доцільно.

Наприклад WebRequest має статичний метод Create. який в залежності від протоколу переданого Uri створює відповідний клас, http - System.Net.HttpWebRequest. ftp - System.Net.FtpWebRequest і т. д.

Теж про System.Security.Cryptography.SymmetricAlgorithm.