Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по ООП (правильно ли реализована задача; Ява)

10K
02 февраля 2007 года
ljevik
48 / / 02.10.2006
Задача: Write a class that can be created only in a single instance and only by some specific method.

For example this should work:

SingleInstance pInst = SingleInstance.getInstance();
pInst.someMethod();

And this shouldn't:

SingleInstance oneInstance = new SingleInstance();
oneInstance.someMethod();

The second call to getInstance() method should return the pointer to the already existing object and do not create a new one.

Программой доказать, что приведенные выше требование выполнены. Вот код, правильно ли я понял и сделал?
Код:
/**
 * class that can be created only in a single instance  
 * and only by some specific method.
 */
package sinstance;

/**
 * @author A.G
 *
 */
public class SingleInstance {
    private static SingleInstance instance = new SingleInstance();
    private SingleInstance(){
   
    }
    /**
     *
     * @return the pointer to the already existing object
     */
    public static SingleInstance getInstance() {
        return instance;
    }
   
    public void loop() {
        for(int i = 0; i < 10; i++) System.out.println(i);
    }
}

/**
 * Class, that is using to test SingleInstance class
 */
package sinstance;

/**
 * @author A.G
 *
 */
public class FirstTask {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SingleInstance pInst = SingleInstance.getInstance();
        pInst.loop();
    }

}
63
02 февраля 2007 года
Zorkus
2.6K / / 04.11.2006
Я на С++ сделал бы так, думаю, что так или с незначительными переделками должно и на яве работать.

Код:
//Header

#ifndef SINGLE_CLASS
#define SINGLE CLASS
class SingleClass
{
.............................
public:
    static SingleClass& GetInstanse()
................................................
private:
    static SingleClass* _instance;
..................................................
}
#endif


Код:
//Implementation

SingleClass* SingleClass::_instance = NULL;
..................................................
SingleClass& SingleClass::GetInstance()
{
    if(SingleCass::_instance == NULL)
    {      
        _instance = new SingleClass();
    }
    return *_instance;
}
SingleClass::SingleClass()
{
.........................
}
10K
02 февраля 2007 года
ljevik
48 / / 02.10.2006
В яве нет ведь указателей? Что я не так в своём примере сделал?:confused:
552
02 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Есть такое паттерн, как синглтон (singleton). Это класс, для которого можно создать ровно один объект (как я понял, именно это и требуется).
Код:
public class SingletonClass {

    private static SingletonClass instance = null;

    protected SingletonClass () {
      . . .
    }

    public static final SingletonClass getInstance() {
        if (instance == null) {
            instance = new SingletonClass ();
        }
        return instance;
    }
    . . .
}


Собсно, вот. Есть статический атрибут instance, который и хранит ссылку на экземпляр. Если он null, то создаем и возвращаем указатель, если не null, то просто возвращаем указатель.
10K
02 февраля 2007 года
ljevik
48 / / 02.10.2006
не, вроде там можно создавать сколько угодно объектов, только способ создания должен быть только
SingleInstance pInst = SingleInstance.getInstance();
pInst.someMethod();

а не

SingleInstance oneInstance = new SingleInstance();
oneInstance.someMethod();
6.6K
03 февраля 2007 года
Aoli
185 / / 22.01.2007
Вот так что-ли?
 
Код:
public class SingleInstance {
    private SingleInstance() {}

    public static SingleInstance oneInstance() {
        return new SingleInstance();
    }
}
552
03 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Aoli, но не вижу смысла в таком методе...
355
03 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
нет, не так. имеется в виду, что синглтон это класс, который контроллирует создание объектов "себя". т.е. в принципе, может быть и не единственный экземпляр, но контроллировать создание должен сам этот класс.
т.е. возможно что-то вроде (пишу на русском)
Код:
class Singleton
{
  private static map<string, Singleton> instances;
  private Singleton()
  {
  }
  public Singleton Instance(string param)
  {
     if (!instances.exists(param))
     {
        instances.set(param, new Singleton());
     }
     return instances.get(param);        
}
6.6K
04 февраля 2007 года
Aoli
185 / / 22.01.2007
Цитата: Ivanhoe
Aoli, но не вижу смысла в таком методе...


Как говорил мой преподаватель по С на вопрос "А зачем нам реализовывать мультисвязный список руками, если есть STL?"
"Ну, незнаю... Прикольно." :)

355
04 февраля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
просто в том примере, что ты написал на самом деле не смысла. с таким же успехом можно было сделать у этого класса публичный конструктор. эффект тот же самый
10K
04 февраля 2007 года
ljevik
48 / / 02.10.2006
спасибо, разобрался, Ivanhoe был прав.
552
04 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
ljevik, отпишите подробнее, что же все-таки требуется...
552
04 февраля 2007 года
Ivanhoe
373 / / 30.04.2006
Аа, не увидел последнего ответа! :) Прошу пардона :)
6.6K
04 февраля 2007 года
Aoli
185 / / 22.01.2007
[QUOTE=<SCORP>;171694]просто в том примере, что ты написал на самом деле не смысла. с таким же успехом можно было сделать у этого класса публичный конструктор. эффект тот же самый[/QUOTE]
Могу отмазаться 2мя способами:
1. А, может, человеку надо в учебных целях?
2. В умной книжке "Refactoring" было написано, что если для создания объекта требуется большое количество операций, то лучше всего использовать factory-метод. В следующей главе было сказано, что если чувствуешь, что программа будет дальше развиваться и для создания объекта в может потребоваться все большее и большее число операций, то лучше сразу сделать factory-метод.

А вообще - вы(Ivanhoe&&SCORP) правы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог