Материалы книги получены с http://www.itlibitum.ru/
Оптимизация с применением производящих функций
Задержимся на минутку. Допустим, ни один из производных классов Grandpa не интересует публику настолько, чтобы различать их при выборе производящей функции. Даже в этом случае конструирование экземпляров с помощью одной или нескольких производящих функций вполне оправдано. В частности, при этом скрывается логика выбора производного класса, экземпляр которого создается на основании информации, предоставленной на момент создания. Иначе говоря, производящие функции могут послужить средством оптимизации ваших программ.
class Number {
public:
static Number* make(); // Конструирует число по умолчанию
static Number* make(int);
static Number* make(double);
static Number* make(string); // Например, "-1.23"
};
// В файле .cpp
class Integer : public Number { ... };
class Real : public Number { ... };
class ArbitraryPrecisionNumber : public Number { ... };
Number* Number::make()
{
return new Integer(0);
}
Number* Number::make(int x)
{
return new Integer(x);
}
Number* Number::make(double x)
{
return new Real(x);
}
Number* Number::make(string s)
{
// Псевдокод
if (малое целое)
return new Integer(atoi(s));
if (большое целое)
return new ArbitraryPrecisionNumber(s);
if (вещественное)
// И т.д.
}
Сделать то же с помощью конструкторов не удастся. К тому моменту, когда компилятор начинает искать конструктор с подходящей сигнатурой, вы уже сообщили ему, экземпляр какого класса создается. Более того, такая методика отделяет структуру производных классов от аргументов производящей функции.
Назад Содержание Далее
|