class Creator { public : virtual Product* CreateProduct () = 0; }; template <class TheProduct> class StandardCreator: public Creator { public: virtual Product* CreateProduct(); }; template <class TheProduct> Product* StandardCreator<TheProduct>::CreateProduct () { return new TheProduct; } /* С помощью данного шаблона клиент передает только класс продукта, по- рождать подклассы от Creator не требуется: */ class MyProduct : public Product { public: MyProduct(); //... }; StandardCreator<MyProduct> myCreator;