Я читал о скоросшивателях строителя от http://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Creational_Patterns ссылка и код ниже, похоже, используют идею, аналогичную идиоме pimpl, имея указатель на pizzaBuilder в классе Cook в качестве частного члена. Есть ли совпадение между идиомами сутенеров и тем, как они используются в шаблонах дизайнеров?
class Cook
{
public:
void setPizzaBuilder(PizzaBuilder* pb)
{
m_pizzaBuilder = pb;
}
Pizza* getPizza()
{
return m_pizzaBuilder->getPizza();
}
void constructPizza()
{
m_pizzaBuilder->createNewPizzaProduct();
m_pizzaBuilder->buildDough();
m_pizzaBuilder->buildSauce();
m_pizzaBuilder->buildTopping();
}
private:
PizzaBuilder* m_pizzaBuilder;
};
Нет. Хотя используемые языковые функции (указатели, закрытые поля) могут быть похожими, предполагаемый результат совершенно другой.
PIMPL довольно прозрачен для пользователя класса — и в этом суть. Ты не видишь CookPimpl
используется в интерфейсе Cook
— это спрятано в .cpp
файл, звонящий не может даже сделать что-нибудь значимое для этого.
Класс Builder, с другой стороны, самодостаточен и может использоваться напрямую, в Cook
класс или в PizzaRestaurant
,
Более того, PIMPL-идиома специфична для C ++ (добавление или удаление закрытого члена приводит к перекомпиляции везде, поскольку определения вставляются с копированием), в то время как шаблоны проектирования стремятся быть независимыми от языка.
Других решений пока нет …