четверг, 18 ноября 2010 г.

Что такое Factory Pattern в SystemVerilog?

    О том, что такое паттерн, уже писалось здесь. Вкратце напомню, что паттерн в ООП - это устоявшееся решение проблем, которые возникали, возникают и будут возникать. У некоторых из этих решений есть свое название. Что же такое 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

    Дополнительно читайте здесь.

Комментариев нет:

Отправить комментарий