c++design-patterns

pimpl idiom vs. bridge design pattern


I just noticed a new term pimpl idiom, what's the difference between this idiom with Bridge design pattern? I am confused about that.

I also noticed the pimpl idiom is always used for swap function, what's that? Could anybody give me an example?


Solution

  • PIMPL is a way of hiding the implementation, primarily to break compilation dependencies.

    The Bridge pattern, on the other hand, is a way of supporting multiple implementations.

    swap is a standard C++ function for exchanging the values of two objects. If you swap the pointer to the implementation for a different implementation, you are essentially changing the mechanism of the class at runtime.

    But in its basic and common form, a class using PIMPL points to a single implementation, so there is no abstract class with distinct subclasses — just one class, forward declared, and compiled elsewhere. Changing the implementation class does not require any recompilation of sources that include the main header.

    For example, say you have a lot of private member functions, private enums, and private data. And these private "bits" change fairly frequently as the class is developed and maintained. If the #include dependencies are such that touching this header file causes a large number of sources to be recompiled, you have a good candidate for PIMPL.

    So the Bridge pattern is about object-oriented design, while the PIMPL idiom is about physical design of files.

    (For more on physical design, I recommend the book Large-Scale C++ Software Design by John Lakos.)