 // Purpose.  Proxy                      class RealImage {
 //                                      public:
 // Strategy.  Decouple clients from        RealImage( int id ) {
 // direct access to sensitive, or             id_ = id;
 // distributed, or expensive-to-create        cout << "   $$ ctor: "<< id_
 // objects.                                      << endl; }
 //                                         ~RealImage() {
 // Discussion.  The Proxy design              cout << "   dtor: " << id_
 // pattern suggests that if you have             << endl; }
 // an object that is expensive to          void draw() {
 // create, then "wrap" it with an             cout << "   drawing image "
 // inexpensive "proxy" that will only            << id_ << endl; }
 // create the original if the user      private:
 // actually asks for it.                   int  id_;
                                         };
 #include <iostream.h>
                                         class Image {
 class Image {                           public:
 public:                                    Image()  {
    Image() {                                  id_ = next_++;
       id_ = next_++;                          theRealThing_ = 0; }
       cout << "   $$ ctor: "<< id_         ~Image() {
          << endl; }                           delete theRealThing_; }
    ~Image() {                              void draw() {
       cout << "   dtor: " << id_              if ( ! theRealThing_)
          << endl; }                              theRealThing_ =
    void draw() {                                    new RealImage(id_);
       cout << "   drawing image "             theRealThing_->draw(); }
          << id_ << endl; }              private:
 private:                                   RealImage*  theRealThing_;
    int         id_;                        int         id_;
    static int  next_;                      static int  next_;
 };                                      };
 int Image::next_ = 1;                   int Image::next_ = 1;

 void main( void )                       void main( void )
 {                                       {
    Image  images[5];                       Image  images[5];
    int    i;                               int    i;

    cout << "Exit[0], Image[1-5]: ";        cout << "Exit[0], Image[1-5]: ";
    cin >> i;                               cin >> i;
    while (i)                               while (i)
    {                                       {
       images[i-1].draw();                     images[i-1].draw();
       cout << "Exit[0], Image[1-5]: ";        cout << "Exit[0], Image[1-5]: ";
       cin >> i;                               cin >> i;
    }                                       }
 }                                       }

 //    $$ ctor: 1                        // Exit[0], Image[1-5]: 2
 //    $$ ctor: 2                        //    $$ ctor: 2
 //    $$ ctor: 3                        //    drawing image 2
 //    $$ ctor: 4                        // Exit[0], Image[1-5]: 4
 //    $$ ctor: 5                        //    $$ ctor: 4
 // Exit[0], Image[1-5]: 2               //    drawing image 4
 //    drawing image 2                   // Exit[0], Image[1-5]: 0
 // Exit[0], Image[1-5]: 4               //    dtor: 4
 //    drawing image 4                   //    dtor: 2
 // Exit[0], Image[1-5]: 0
 //    dtor: 5
 //    dtor: 4
 //    dtor: 3
 //    dtor: 2
 //    dtor: 1

