home | login | register | DMCA | contacts | help | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


my bookshelf | genres | recommend | rating of books | rating of authors | reviews | new | форум | collections | читалки | авторам | add
fantasy
space fantasy
fantasy is horrors
heroic
prose
  military
  child
  russian
detective
  action
  child
  ironical
  historical
  political
western
adventure
adventure (child)
child's stories
love
religion
antique
Scientific literature
biography
business
home pets
animals
art
history
computers
linguistics
mathematics
religion
home_garden
sport
technique
publicism
philosophy
chemistry
close

Loading...


«Фабричный метод»

Паттерн Factory Method позволяет реализовать идею «виртуального конструктора», то есть создания объектов без явного указания их типа. Обычно он применяется, когда базовый класс делегирует потомкам право принятия решений о типе создаваемого объекта. Предположим, что нам надо написать программу для сохранения документа на диск, причем в разных форматах: XML, txt, doc и даже бинарном. Создадим базовый класс, где будет код открытия файла и фабричный метод для создания конкретного объекта, который будет сохранять данные в этот файл.

class DocumentWriter

{

public: virtual void writeDoc(const Document& doc, FILE& file) = 0;

};

class SaveDocument

{

protected:

virtual DocumentFileWriter* createDocumentWriter() const = 0;

public:

void save(const char* fileName)

{

FILE file = openFile(fileName);

// Фабричный метод

DocumentFileWriter* writer = createDocumentWriter();

writer->writeDoc();

closeFile(file);

}

};

Обратите внимание, что теперь не надо менять базовые классы для добавления любого нового формата выходного файла. Нужно только создать два простых дополнительных класса, например для вывода в XML (см. листинг 1).

Листинг 1


class DocumentWriterXml: public DocumentWriter

{

public:

virtual void writeDoc(const Document& doc, FILE& file)

{

// код для сохранения документа в формате XML в файл file

}

};

class SaveDocumentXml: public SaveDocument

{

protected:

virtual DocumentFileWriter* createDocumentWriter() const {return new DocumentWriterXml();}

};

Главный недостаток этого шаблона – необходимость создания двух дополнительных классов при добавлении новой функции.


Что такое шаблоны проектирования | Журнал PC Magazine/Russian Edition #01/2009 | «Абстрактная фабрика»







Loading...