Хелпикс

Главная

Контакты

Случайная статья





Factory method



Фабричный метод – это порождающий паттерн проектирования, который решает проблему создания различных продуктлв без указания конкретных классов продуктов

Фабричный метод задает метод, который следует использовать вместо вызова оператора new для создания объектов-продуктов. Подклассы могут переопределить этот метод, чтобы изменять тип задаваемых продуктов.

Если использовать премеры выше, то продуктом является IFileOutputter. А для того, чтобы реализовать фабричный метод, необходимо создать класс, который пораждает конкретные продукты WindowsFileOutputter и LinuxFileOutputter.

Используется, когда: классу заранее неизвестно, объекты каких подклассов ему нужно создавать. класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.

 

enum class SystemType

{

WINDOWS,

LINUX

};

 

struct FileOutputterFactory

{

std:: unique_ptr< IFileOutputter> createFileOutputter(

   const SystemType systemType) const

{

   switch (systemType)

   {

       case SystemType:: WINDOWS:

       {

           return std:: make_unique< WindowsFileOutputter> ();

       }

       case SystemType:: LINUX:

       {

           return std:: make_unique< LinuxFileOutputter> ();

       }

   }

}

};

Теперь для того, чтобы записать что-нибудь в файл мы пишем следущее:
const auto winFileOutputterPtr = createFileOutputter(SystemType:: WINDOWS);

winFileOutputterPtr-> writeMessage(" some path", " some message" );

или же

const auto linFileOutputterPtr = createFileOutputter(SystemType:: LINUX);

linFileOutputterPtr-> writeMessage(" some path", " some message" );

Преимущества:

· Избавляет класс от привязки к конкретным классам продуктов.

· Выделяет код производства продуктов в одно место, упрощая поддержку кода.

· Упрощает добавление новых продуктов в программу.

· Реализует принцип открытости/закрытости.

Недостатки:

· Может привести к созданию больших параллельных иерархий классов, так как для каждого класса продукта надо создать свой подкласс создателя.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.