• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Factory паттерн

  • Автор темы NikSoft
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

NikSoft

В одной из моих заметок(Как работать с двумя базами данных без перекомпиляции проекта) я упомянул о Factory паттерн. Сейчас поговорим о нем более подробно.
Factory паттерн возвращает обьект одного из нескольких возможных классов в зависимости от данных, которые передаются паттерну. Обычно эти классы имеют общий базовый класс и общие методы, но каждый из них решает свою задачу.
Пример.
Допустим у нас есть два банковских счета разных видов: срочный и сберегательный. На срочном счете мы храним деньги в рублях, а на сберегательном в евро. Создадим общий базовый класс:
Код:
class Account
{
protected int _rubles = 0;
protected int _euros = 0;

public string Rubles
{
get
{
return String.Format("{0} rubles", _rubles);
}
set
{
_rubles = Convert.ToInt32(value);
}
}
public string Euros
{
get
{ 
return String.Format("{0} euros", _euros);
}
set
{
_euros = Convert.ToInt32(value);
}
}
}
Заметь, что базовый класс Account не имеет конструктора для инициализации полей класса: _rubles, _euros.
Создадим два класса, которые наследуют класс Account.
Код:
class CheckingAccount: Account
{
public CheckingAccount(string money)
{
Rubles = money; 
}
}	
class SavingAccount: Account
{
public SavingAccount(string money)
{
Euros = money; 
}
}
Оба класса имеют конструкторы, которые инициализируют поля класса Account, используя наследуемые свойства Rubles, Euros.
Промоделируем банковскую машину в помощью интерфейса, изображение которого можно найти в файле, прикрепленным к данному сообщению Image1.gif .
Мы можем изменить банковские счета, введя соответствующие значения в поля CheckingAccount и SavingAccount. Нажимая на кнопку ”Show currency”, выводим значение соответствующего поля в зависимости от установки radio кнопки. В нашем случае выведено 1000 rubles. Если бы была установлена radio кнопка Euros, то было бы выведено 200 euros.
Создадим класс AccountFactory.
Код:
class AccountFactory
{
public AccountFactory(){ }

public Account getAccount(Form form)
{
if ( ((RadioButton)form.Controls.Find("radioButton1",true)[0]).Checked )
{
return new CheckingAccount(((TextBox)form.Controls.Find("textBox1", true)[0]).Text);
}
else
{
return new SavingAccount(((TextBox)form.Controls.Find("textBox2", true)[0]).Text);
}
}
}
В зависимости от того какая radio кнопка установлена, мы возвращаем обьект типа CheckingAccount или SavingAccount, передавая в качестве параметра значение соответствующего текстового поля. При нажатии на кнопку ”Show currency”, будет выполнен следующий код.
Код:
private void button1_Click(object sender, EventArgs e)
{
Account ac = (new AccountFactory()).getAccount(this);
label3.Visible = true;
abel3.Text = radioButton1.Checked?ac.Rubles:ac.Euros;
}
Переменная “ac” будет содержать ссылку на обьект типа CheckingAccount или SavingAccount. Мы не обязаны знать на обьект какого типа переменная “ac” ссылается, так как Factory паттерн делает это за нас. Мы должны знать только то, что класс Account имеет два свойства Rubles и Euros.
Таким образом Factory паттерн создает абстракцию, которая решает какой обьект из нескольких возможных классов возвратить в зависимости от данных, которые передаются паттерну.
 
K

karlito

ИМХО
Не с того начинаешь. Ты объясняешь как он работает, но не объясняешь ЗАЧЕМ? рассматривать такие вопросы нужно на более абстрактном уровне - "философии паттерна": существующей проблемы, путей её решения, альтернативные варианты...

Идея паттернов не в РЕАЛИЗАЦИИ, а в ИДЕЕ.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!