2013-06-14 5 views
2

Я читал об исправлениях строителя из ссылки http://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Creational_Patterns, а приведенный ниже код, похоже, использует идею, похожую на pimpl idiom, указав указатель на pizzaBuilder в классе Cook как частный член. Есть ли какое-либо совпадение между идиомами сутенера и тем, как оно используется в дизайнерских шаблонах?совпадение между идиомой pimpl и шаблонами построек?

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; 
}; 

ответ

2

No. Хотя используемые языковые функции (указатели, частные поля) могут быть похожими, предполагаемый результат совершенно другой.

PIMPL довольно прозрачный для пользователя класса - и это точка. Вы не видите CookPimpl, используемый в интерфейсе Cook - он скрыт в файле .cpp, вызывающий не может даже сделать ничего значимого для него.

Класс строителя с другой стороны является самодостаточным и может использоваться непосредственно в классе Cook или в PizzaRestaurant.

К тому же, PIMPL idiom является C++-специфичным (добавление или удаление частного члена приводит к перекомпиляции повсюду, поскольку определения скопированы), в то время как шаблоны проектирования стремятся быть языковыми агностиками.

+0

Не является ли pImpl главным образом из-за того, что компилятор должен знать размер объекта, а не из-за отсутствия модулей? – templatetypedef

+0

@templatetypedef О, подождите, вы правы. Позвольте мне исправить свой ответ. – milleniumbug