/**
* 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();
}
}
Вопрос по ООП (правильно ли реализована задача; Ява)
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.
Программой доказать, что приведенные выше требование выполнены. Вот код, правильно ли я понял и сделал?
Код:
Код:
//Header
#ifndef SINGLE_CLASS
#define SINGLE CLASS
class SingleClass
{
.............................
public:
static SingleClass& GetInstanse()
................................................
private:
static SingleClass* _instance;
..................................................
}
#endif
#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()
{
.........................
}
SingleClass* SingleClass::_instance = NULL;
..................................................
SingleClass& SingleClass::GetInstance()
{
if(SingleCass::_instance == NULL)
{
_instance = new SingleClass();
}
return *_instance;
}
SingleClass::SingleClass()
{
.........................
}
В яве нет ведь указателей? Что я не так в своём примере сделал?:confused:
Код:
public class SingletonClass {
private static SingletonClass instance = null;
protected SingletonClass () {
. . .
}
public static final SingletonClass getInstance() {
if (instance == null) {
instance = new SingletonClass ();
}
return instance;
}
. . .
}
private static SingletonClass instance = null;
protected SingletonClass () {
. . .
}
public static final SingletonClass getInstance() {
if (instance == null) {
instance = new SingletonClass ();
}
return instance;
}
. . .
}
Собсно, вот. Есть статический атрибут instance, который и хранит ссылку на экземпляр. Если он null, то создаем и возвращаем указатель, если не null, то просто возвращаем указатель.
SingleInstance pInst = SingleInstance.getInstance();
pInst.someMethod();
а не
SingleInstance oneInstance = new SingleInstance();
oneInstance.someMethod();
Код:
public class SingleInstance {
private SingleInstance() {}
public static SingleInstance oneInstance() {
return new SingleInstance();
}
}
private SingleInstance() {}
public static SingleInstance oneInstance() {
return new SingleInstance();
}
}
Aoli, но не вижу смысла в таком методе...
т.е. возможно что-то вроде (пишу на русском)
Код:
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);
}
{
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);
}
Цитата: Ivanhoe
Aoli, но не вижу смысла в таком методе...
Как говорил мой преподаватель по С на вопрос "А зачем нам реализовывать мультисвязный список руками, если есть STL?"
"Ну, незнаю... Прикольно." :)
просто в том примере, что ты написал на самом деле не смысла. с таким же успехом можно было сделать у этого класса публичный конструктор. эффект тот же самый
спасибо, разобрался, Ivanhoe был прав.
ljevik, отпишите подробнее, что же все-таки требуется...
Аа, не увидел последнего ответа! :) Прошу пардона :)
Могу отмазаться 2мя способами:
1. А, может, человеку надо в учебных целях?
2. В умной книжке "Refactoring" было написано, что если для создания объекта требуется большое количество операций, то лучше всего использовать factory-метод. В следующей главе было сказано, что если чувствуешь, что программа будет дальше развиваться и для создания объекта в может потребоваться все большее и большее число операций, то лучше сразу сделать factory-метод.
А вообще - вы(Ivanhoe&&SCORP) правы.