N
NikSoft
В одной из моих заметок(Как работать с двумя базами данных без перекомпиляции проекта) я упомянул о Factory паттерн. Сейчас поговорим о нем более подробно.
Factory паттерн возвращает обьект одного из нескольких возможных классов в зависимости от данных, которые передаются паттерну. Обычно эти классы имеют общий базовый класс и общие методы, но каждый из них решает свою задачу.
Пример.
Допустим у нас есть два банковских счета разных видов: срочный и сберегательный. На срочном счете мы храним деньги в рублях, а на сберегательном в евро. Создадим общий базовый класс:
Заметь, что базовый класс Account не имеет конструктора для инициализации полей класса: _rubles, _euros.
Создадим два класса, которые наследуют класс Account.
Оба класса имеют конструкторы, которые инициализируют поля класса Account, используя наследуемые свойства Rubles, Euros.
Промоделируем банковскую машину в помощью интерфейса, изображение которого можно найти в файле, прикрепленным к данному сообщению .
Мы можем изменить банковские счета, введя соответствующие значения в поля CheckingAccount и SavingAccount. Нажимая на кнопку ”Show currency”, выводим значение соответствующего поля в зависимости от установки radio кнопки. В нашем случае выведено 1000 rubles. Если бы была установлена radio кнопка Euros, то было бы выведено 200 euros.
Создадим класс AccountFactory.
В зависимости от того какая radio кнопка установлена, мы возвращаем обьект типа CheckingAccount или SavingAccount, передавая в качестве параметра значение соответствующего текстового поля. При нажатии на кнопку ”Show currency”, будет выполнен следующий код.
Переменная “ac” будет содержать ссылку на обьект типа CheckingAccount или SavingAccount. Мы не обязаны знать на обьект какого типа переменная “ac” ссылается, так как Factory паттерн делает это за нас. Мы должны знать только то, что класс Account имеет два свойства Rubles и Euros.
Таким образом 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.
Код:
class CheckingAccount: Account
{
public CheckingAccount(string money)
{
Rubles = money;
}
}
class SavingAccount: Account
{
public SavingAccount(string money)
{
Euros = money;
}
}
Промоделируем банковскую машину в помощью интерфейса, изображение которого можно найти в файле, прикрепленным к данному сообщению .
Мы можем изменить банковские счета, введя соответствующие значения в поля 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);
}
}
}
Код:
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;
}
Таким образом Factory паттерн создает абстракцию, которая решает какой обьект из нескольких возможных классов возвратить в зависимости от данных, которые передаются паттерну.