Проста фабрика

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Проста фабрика (англ. Simple Factory) — ідіома програмування, яка полягає в інкапсуляції (приховуванні) в окремому класі екземплярів інших класів.

Використання

[ред. | ред. код]

Основна ідея полягає в приховуванні від клієнта подробиць створення об'єкту. Реалізація проста: клієнт не має прямого доступу до конструктора, потрібний йому об'єкт (продукт) повертає метод об'єкту класу фабрики.

Одна фабрика може мати багатьох класів-клієнтів. Також клас фабрика є єдиною частиною програми, що працює з конкретними класами продуктів.

Однією з основних проблем простої фабрики є сильне зв'язування[джерело?]. Для створення екземплярів потрібно використовувати конкретний клас, а не інтерфейс.

Приклад цієї ідіоми можна знайти в деяких класичних шаблонах програмування (наприклад, будівельник).

Приклад мовою С#

[ред. | ред. код]
class HungryMan
{
    public void Eat(string type)
    {
        PizzaProducts.PizzaBar pb = new PizzaProducts.PizzaBar();
        PizzaProducts.Pizza p = pb.Cookpizza(type);
    }
}

namespace PizzaProducts
{
    abstract class Pizza
    {
        protected string ptype;
        public override string ToString()
        {
            return ptype;
        }
    }
    class NewYorkPizza : Pizza
    {
        internal NewYorkPizza() { ptype = "New York Pizza"; }
    }
    class ItalianPizza : Pizza
    {
        internal ItalianPizza() { ptype = "Italian Pizza"; }
    }
    class PizzaBar
    {
        public Pizza Cookpizza(string type)
        {
            switch (type)
            {
                case "NewYork":
                    return new NewYorkPizza();
                case "Italian":
                    return new ItalianPizza();
                default:
                    return null;
            }
        }
    }
}

У даному прикладі клас HungryMan - клас-клієнт, PizzaBar - клас-фабрика, ItalianPizza та NewYorkPizza - класи-продукти. Клас PizzaBar повертає певний об'єкт класу продукту залежно від отриманих параметрів. При цьому логіка приготування піци інкапсульована в методі Cookpizza(). Об'єкт класу HungryMan викликає цей метод для отримання своєї піци.