Назад
Создание прибыльного бизнеспроекта на базе сайта

SEO + ASP.NET 4.0 + БИЗНЕСМОДЕЛЬ = ПРИБЫЛЬНЫЙ САЙТ

Инструмент быстрого построения прибыльного онлайн бизнеса своими силами без капиталовложений за 4 месяца все подробности на SEO + ASP.NET 4.0.

Подписка на рассылку

МАГИЯ C#!

Создание вебсайта с формой автоматического приема онлайн платежей по WebMoney!
Ваше имя
Ваш e-mail
Уроки по ASP.NET c# ADO.NET
     

18 видеоуроков
более 5 часов
по созданию сайта,
выполняющего
продажи ваших продуктов (физических/электронных) на полном автомате с личным оповещением на e-mail, а также ...
DVD-курс по C#, .NET

3 часть. Введение в ASP.NET. WebServices Профессиональная подготовка разработчика по языку C# на платформе .NET

asp.net webservices dvd c# gridview Гудок курс Более 65 подробных видео уроков по теоретическим основам технологии сайтостроения ASP.NET и процессу создания и использованию вебсервисов.

DVD-курс по C#, .NET

2А часть. XML/TXT в аспекте ADO.NET Профессиональная подготовка разработчика по языку C# на платформе .NET

xml txt dvd c# ADO ADO.NET Гудок курс 70 подробных видео уроков по работе с форматами xml, txt, по работе с файлами и директориями. Разработка высокоорганизованных свойств для значительного сокращения объема исходного кода и облегчения дальнейшей модификации и многое-многое другое...

DVD-курс по C#, .NET

1 часть. Windows Forms Профессиональная подготовка разработчика по языку C# на платформе .NET

Профессиональная подготовка на c# А. Гудок

185 подробнейших уроков (70 часов) лекций в формате видеоуроков по теории языка c# и платформы .NET. Практическое закрепление теоретического материала на примере создания Windows Forms - приложения видеоигры "Tanks"

DVD-курс по C#, .NET

2 часть. ADO.NET/SQL Профессиональная подготовка разработчика по языку C# на платформе .NET

Профессиональная подготовка на c# А. Гудок ADO.NET sql

165 подробных видео уроков по созданию приложений распределенных баз данных на примере разработки проектов с использований технологий ADO.NET (Connected model, Disconnected model, Typed DataSet, ...)


Я записываю курсы!
  Курс валют

НБУ курс евро






Шаблон Factory Method



Factory Method дает возможность подклассам создавать некоторые классы с помощью общего интерфейса, причем именно наследники определяют, какой родительский объект следует реализовать. То есть, нужен какой то, общий интерфейс. Этим интерфейсом в языке программирования C# может быть абстрактный класс либо интерфейс.

Представьте себе такой абстрактный класс:

abstract class Product
{
    public abstract decimal PurchasePrice {get;	set;}

    public abstract decimal Price {get;	set;}

    public abstract string Description	{get; set;}
}

Если мы унаследуем этот класс, то обязаны придерживаться принципа полиморфизма. То есть, переопределить все свойства этого класса, используя слово override. Давайте так и сделаем. Создаем класс, унаследованный от класса Product, который будет инкапсулировать логику конкретного продукта:

class Computer : Product
{
    private decimal _purchase_price;
    private decimal _price;
    private string _description;

    public Computer() : this(null) { }
    public Computer(string _description) 
      : this(_description, 0) { }
    public Computer(string _description, decimal _purchase_price)
        : this (_description, _purchase_price, 0) { }

    public Computer(string _description, decimal _purchase_price,
                    decimal _price)
    {
        this._description = _description;
        this._purchase_price = _purchase_price;
        this._price = _price;
    }

    public override string Description
    {
        get { return _description; }
        set { _description = value; }
    }

    public override decimal Price
    {
        get { return _price; }
        set {	_price = value; }
    }

    public override decimal PurchasePrice
    {
        get { return _purchase_price; }
        set {	_purchase_price = value; }
    }
}

Класс Product — предназначен для определения интерфейса объектов, создаваемых фабричным методом. Это как бы базовая оболочка для продуктов. Продукт имеет цену и т.д. Если хотите, допишите в класс Product еще пару свойств, методов, и переопределите их в наследуемом классе. Надеюсь что пока все ясно. Прежде чем я продолжу, скажу пару слов о самом паттерне. Обычно мы используем конкретный класс и пишем вот так:

Computer computer = new Computer();

Но, данный шаблон гласит о том, что в тексте программы можно оперировать не какими-то конкретными классами, а их абстрактными представлениями. Вот наиболее популярные случаи, в которых имеет смысл применять обсуждаемый здесь шаблон:

  • класс, создающий подклассы, заранее не знает, какими они будут;
  • класс был спроектирован так, что создаваемые им объекты специфицируются подклассами;
  • класс делегирует свои обязанности одному из вспомогательных подклассов, после чего планируется локализовать знание о том, какой класс принимает эти обязанности на себя;

Вот что имеется ввиду:

шаблон проектирования фабричный метод

На диаграмме добавилось еще два класса. Следуя шаблону, должен быть еще один абстрактный класс, в котором и будет фабричный метод. Это как бы фабрика, которая создает продукты конкретного вида. Когда определен абстрактный класс Creator с фабричным методом, мы можем создать свой унаследованный класс для конкретного продукта. Чтоб легче было понять, упростим диаграмму:

шаблон проектирования фабричный метод

Вот и все пироги. Есть абстрактный класс продукта и создателя, в котором есть фабричный метод. Создаем класс конкретного продукта (унаследован от Product) рас, создаем конкретный класс создатель конкретного продукта (унаследован от Creator) два.

Вот какой вид имеет абстрактный класс Creator:

abstract class Creator
{
    public abstract Product FactoryMethod();
    public abstract Product FactoryMethod(string _description);
    public abstract Product FactoryMethod(string _description,
        decimal _purchase_price);
    public abstract Product FactoryMethod(string _description,
        decimal _purchase_price, decimal _price);
}
В этом классе, я определил методы для всех видов конструкторов класса Computer. А вот создатель-класс для класса Computer:
class ComputerCreator : Creator
{
    public override Product FactoryMethod()
    {
        return new Computer();
    }

    public override Product FactoryMethod(string _description)
    {
        return new Computer(_description);
    }

    public override Product FactoryMethod(string _description,
        decimal _purchase_price)
    {
        return new Computer(_description, _purchase_price);
    }

    public override Product FactoryMethod(string _description,
        decimal _purchase_price, decimal _price)
    {
        return new Computer(_description,_purchase_price,_price);
    }
}

Все, теперь у нас все как на рис. 1. Видим, что фабричные методы перегружены, для того чтоб была возможность вызвать нужный конструктор класса Computer.

Создадим еще один класс CDPlayer и класс создатель для него аналогичным образом:

Класс CDPlayer:

class CDPlayer : Product
{
    private decimal _purchase_price; // цена закупки
    private decimal _price; // цена продажи
    // масив форматов, которые поддерживет сд плеер
    private string _description; 

    public CDPlayer() : this(null) { }
    public CDPlayer(string _description) 
       : this(_description, 0) { }
    public CDPlayer(string _description, decimal _purchase_price)
       : this(_description, _purchase_price, 0) { }

    public CDPlayer(string _description,
        decimal _purchase_price, decimal _price)
    {
        this._description = _description;
        this._purchase_price = _purchase_price;
        this._price = _price;
    }

    public override string Description
    {
        get { return _description; }
        set { _description = value; }
    }

    public override decimal Price
    {
        get { return _price; }
	  set{	_price = value;}
    }

    public override decimal PurchasePrice
    {
        get { return _purchase_price; }
        set {	_purchase_price = value;}
    }
}

Создатель-класс для класса CDPlayer:

class CDPlayerCreator : Creator
{

    public override Product FactoryMethod()
    {
        return new CDPlayer();
    }

    public override Product FactoryMethod(string _description)
    {
        return new CDPlayer(_description);
    }

    public override Product FactoryMethod(string _description,
        decimal _purchase_price)
    {
        return new CDPlayer(_description, _purchase_price);
    }

    public override Product FactoryMethod(string _description,
        decimal _purchase_price, decimal _price)
    {
        return new CDPlayer(_description, _purchase_price, _price);
    }
}

Все что нам осталось, это написать клиентский код, что бы полюбоваться нашей работой.

static void Main(string[] args)
{
    List<Product> productList = new List<Product>();

    Creator[] creators = new Creator[2];
    creators[0] = new ComputerCreator();
    creators[1] = new CDPlayerCreator();

    foreach (Creator cr in creators)
    {
       	if (cr is ComputerCreator)
           productList.Add(cr.FactoryMethod("Ноут бук", 600, 800));

        if (cr is CDPlayerCreator)
       	productList.Add(cr.FactoryMethod("audio,mp3,mp4",250,360));
    }

    foreach (Product pr in productList)
    {
        Console.WriteLine("Обьект класса {0};\n" +
             "Описание: {1};\n" +
             "Закупочная цена: {2};\n" +
             "Цена продажы: {3};\n",
             pr.GetType().Name,
             pr.Description,
             pr.PurchasePrice,
             pr.Price);
    }
    
    Console.ReadLine();
}

Вот результат программы:

шаблон проектирования фабричный метод

Как по мне, то тут интересный факт. Экземпляр абстрактного класса создать нельзя. Но никто не говорил, что он не может служить как базовый. Если написать следующим образом, то все будет в порядке:

Product pr = new Computer();

Здесь ссылка pr (абстрактного класса) ссылается на объект класса Computer. По этой причине я спокойно могу создать специализированную коллекцию, как это и было сделано. Когда я увидел этот шаблон, я сразу заметил такие стадии разработки:

  • Абстрактный класс для объектов –> напротив класс, который его реализует для своих целей.
  • Абстрактный класс для создания объектов –> напротив класс, который его реализует для создания своих обьектов.
Иными словами:

Product — собственно продукт. Предназначен для определения интерфейса объектов, создаваемых фабричным методом;

ConcreteProduct(Computer, CDPlayer ) — конкретные продукты, которые участвуют в схеме, и отвечают за реализацию абстрактного класса (интерфейса) Product.

Creator — создатель, и его название говорит само за себя. Данный объект предназначен для объявления фабричного метода, возвращающего объект типа Product.

ConcreteCreator — конкретный создатель. Здесь все очевидно: конкретная реализация создателя занимается тем, что возвращает конкретный продукт. В нашем примере две конкретные реализации создателя — ComputerCreator и CDPlayerCreator.

Создатель доверяет своим подклассам реализацию подходящего онкретного продукта. В этом и заключается суть Factory Method.

Теперь отметим плюсы и минусы данного паттерна:

Самый очевидный недостаток Factory Method — необходимость создавать наследника Creator всегда, когда планируется получить новый тип продукта (т.е. новый ConcreteProduct). И этого, увы, не избежать. Но подобная проблема присутствует во многих порождающих шаблонах. К достоинствам же следует отнести возможность создавать объекты более универсально, не ориентируясь на конкретные классы и оперируя общим интерфейсом.



Больше информации читайте по теме:

Методы расширения в C#
Использование делегатов в событиях на C# - Часть 2
Использование делегатов в событиях на C#
Автозапуск программы в C#
Обобщенные делегаты на C#
Регулярные выражения в c#
c# - сортировка List<T>
Пространства имен в c#
c# - Использование Shell (для получения списка файлов/папок)
Методы классов Math и Random в c#
Строковые массивы класса string в c#
c# - Символьные массивы
Массивы в C#
Операторы языка C#
Операции языка C# и особенности их использования
Шифрование на c# (хеш-код строки по алгоритму MD5)
Отписка от событий в c#
Примеры регулярных выражений на c# (класс RegularExpressions.Regex)
c# - итератор для списка Dictionary (foreach для словаря)
Перемешивание списков (массивов) любых типов на c# - противоположность сортировки
c# - CultureInfo (IFormatProvider) и конвертация, приведение числовых типов
Работа в c# с DateTime - получение набора дат в текущем году
GZip - архивация (упаковка) файлов на c#
DateTime - пример определения даты и времени
Время выполнения операций c#
Паттерн (шаблон) SingleTon средствами c#
Обобщенная коллекция Dictionary
c# структуры - не классы?! А что же это - struct VS class
Создание пользовательских событий на c#
Выборка файлов из директории и поддиректорий на c#
Делегаты и методы на c#
Запуск одного экземпляра приложения на c#
c# - Битовый флаг enum



Оценить статью:

Оценивая статью, Вы подсказываете нам насколько данная информация стала полезной именно для Вас. Мы ожидаем, прежде всего, оценку доступности материала для понимания и простоты его изложения. Дополнительные комментари, вопросы, дополнения и замечания Вы можете указать на странице От Вас

Частичное, или полное копирование материала данной статьи возможно лишь при размещении ссылки на данную страницу.


            
        




Имя:  


Текст комментариев (не больше 600 знаков):  
введите не более 600 знаков



Введите символы с картинки:
Капча имеет "срок годности". Поэтому, если необходимо обновите страницу.



Сантехник срочно
c# курс Гудок   курс по ASP.NET Гудок   курс по ADO.NET Гудок   курс по XML txt Гудок   курс по рефлексии и многопоточности Гудок