О том, что такое паттерн, уже писалось здесь. Вкратце напомню, что паттерн в ООП - это устоявшееся решение проблем, которые возникали, возникают и будут возникать. У некоторых из этих решений есть свое название. Что же такое factory pattern (или фабричный паттерн)? Сперва обратимся к определению фабричного метода из wiki:
Фабричный метод (англ. Factory Method) — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор. Фабричный паттерн нацелен на решение проблемы создания объекта. Есть еще набор паттернов, которые имеют отношение к созданию объекта, предназначенные для различных случаев. Они известны под названием creational patterns (порождающие паттерны).
Рассмотрим пример использования порождающего паттерна на SystemVerilog. Создадим класс для "Фабрики роботов", который необходим, чтобы создавать разные типы роботов (Андроид (android), Боевой робот (robokiller), Бытовой робот (robomama), Персональный робот (robocomp)). Тип робота будет выбираться с помощью входной строки.
Для каждого типа робота нам потребуется свой класс. Создадим базовый класс ROBO, который будет содержать общие для всех классов переменные, подзадачи task, функции function. Остальные классы будут наследовать базовый класс:
class ROBO;
// Общие объекты данных
string type;
// Общие методы
virtual function string get_type();
endclass : ROBO
class ANDROID extends ROBO;
function new();
this.string = "Android";
endfunction : new
string function string get_type();
return this.string;
endfunction : get_type
endclass : ANDROID
class ROBOKILLER extends ROBO;
function new();
this.string = "ROBOKILLER";
endfunction : new
string function string get_type();
return this.string;
endfunction : get_type
endclass : ROBOKILLER
Теперь опишем класс "фабрики роботов" (ROBO_FACTORY). Для простоты пронумеруем каждый тип робота, чтобы было легче выбирать, какого робота создавать.
class ROBO_FACTORY;
ROBO my_robo
// Общие методы
function ROBO get_robo(int type);
if(type == 1) this.my_robo = new ANDROID();
if(type == 2) this.my_robo = new ROBOKILLER();
return this.my_robo;
endfunction : get_robo
endclass : ROBO_FACTORY
Дополнительно читайте здесь.
Комментариев нет:
Отправить комментарий