Паттерн: что выдаст этот код?

Опубликовано Mar 21, 2012 в ООП, Разбор примеров кода | 10 коммент.

, ,

Паттерн: что выдаст этот код?

Имеется вариант реализации некоторого класса. Метод initialize() может быть написан двумя способами.

using namespace std;
class foo
{
public:
    int data; 
 
    //First option                            //Second option
    static void initialize(){                  static void initialize(){
      if (!inst) inst = new foo;                  delete inst;
    }                                             inst = new foo;
                                               }
 
    static void shutdown(){
        delete inst;
        inst = 0;
    }
    static foo& const instance(){
        return *inst;
    }
 
private:
    static  foo* inst;
 
    foo()
    { data = 22; }
 
    ~foo() {}
};
foo* foo::inst = 0;

Вопросы

1. На какой классический паттерн похож данный класс и чего в нем не хватает?

2. Что выдаст приведеный ниже код, который содержит различные способы использования данного класса?

3. Будут ли различия в выводе в зависимости от способа реализации метода initialize()?

Вариант 1

int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    instance.data = 33;
 
    cout << foo::instance().data << " " << instance.data << endl;
 
    foo::initialize();
}
    cout << foo::instance().data <<  " " << instance.data << endl;

Вариант 2

int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    int inst_data = instance.data;
    instance.data = 33;
    foo& instance1 =  foo::instance();
    int inst1_data = instance1.data;
 
    cout << inst_data <
int main()
{
    foo::initialize();
    foo& instance =  foo::instance();
    instance.data = 33;
 
    cout << foo::instance().data << endl;
 
    foo::shutdown();
    foo::initialize();
 
    cout << foo::instance().data << endl;
}

Автор публикации: