 // Purpose.  Abstract Factory           #include <iostream.h>
 //
 // Discussion.  Trying to maintain      class Widget { public:
 // portability across multiple "plat-      virtual void draw() = 0;
 // forms" routinely requires lots of    };
 // preprocessor "case" stmts.  The
 // Factory pattern suggests defining    class MotifBtn : public Widget {
 // a creation services interface in a   public:
 // Factory base class, and implement-      void draw() { cout << "MotifBtn"
 // ing each "platform" in a separate          << endl; }
 // Factory derived class.               };

 #include <iostream.h>                   class WindowsBtn : public Widget {
                                         public:
 class Widget { public:                     void draw() { cout << "WindowsBtn"
    virtual void draw() = 0;                   << endl; }
 };                                      };

 class MotifBtn : public Widget {        class Factory { public:
 public:                                    virtual Widget* createBtn() = 0;
    void draw() { cout << "MotifBtn"     };
       << endl; }
 };                                      class MotifFactory : public Factory {
                                         public:
 class WindowsBtn : public Widget {         Widget* createBtn() {
 public:                                       return new MotifBtn; }
    void draw() { cout << "WindowsBtn"   };
       << endl; }
 };                                      class WindowsFactory : public Factory {
                                         public:
 void doThisWindow() {                      Widget* createBtn() {
    // create window, attach btn               return new WindowsBtn; }
 #ifdef MOTIF                            };
    Widget* w = new MotifBtn;
 #else // WINDOWS                        Factory* factory;
    Widget* w = new WindowsBtn;
 #endif                                  void doThisWindow() {
    w->draw(); }                            // create window, attach btn
                                            Widget* w = factory->createBtn();
 void doThatWindow() {                      w->draw(); }
    // create window, attach btn
 #ifdef MOTIF                            void doThatWindow() {
    Widget* w = new MotifBtn;               // create window, attach btn
 #else // WINDOWS                           Widget* w = factory->createBtn();
    Widget* w = new WindowsBtn;             w->draw(); }
 #endif
    w->draw(); }                         void main( void )
                                         {
 void main( void )                       #ifdef MOTIF
 {                                          factory = new MotifFactory;
    // create window, attach btn         #else // WINDOWS
 #ifdef MOTIF                               factory = new WindowsFactory;
    Widget* w = new MotifBtn;            #endif
 #else // WINDOWS
    Widget* w = new WindowsBtn;             // create window, attach btn
 #endif                                     Widget* w = factory->createBtn();
    w->draw();                              w->draw();

    doThisWindow();                         doThisWindow();
    doThatWindow();                         doThatWindow();
 }                                       }

 // WindowsBtn                           // MotifBtn
 // WindowsBtn                           // MotifBtn
 // WindowsBtn                           // MotifBtn

