Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Паттерны] паттерн [Singleton] (http://www.flasher.ru/forum/showthread.php?t=213839)

zackscript 29.01.2017 18:44

паттерн [Singleton]
 
Google говорит:
Цитата:

порождающий паттерн, который гарантирует, что для определенного класса будет создан только один объект
Меня'ж одно интересует, объект только одного класса может быть создан один раз ?(также предоставит к этому объекту точку доступа.) или же создавать объекты и других классов где также можно обращаться из любого места.
Конечно же я не говорю что бы все объекты создавать так что'б иметь точку доступа из любого места а лишь те которые действительно нужны.
p.s. У меня такое ассоциация складывается что Singleton должен создавать строго один объект класса, так что, кто что скажет ?

Wolsh 29.01.2017 20:04

Если я правильно понял вопрос, то ответ: можете оформлять как синглтон хоть один, хоть пять, хоть все классы, если надо.
"Паттерн" не означает, что ему подчиняется весь проект. Это просто шаблон решения какой-то задачи. В данном случае это просто способ организовать синглтон. Синглтон это не всё приложение. Это всего-лишь один объект, который должен отвечать определенным требованиям, чтобы реализовать синглтон. А сколько таких объектов разных классов будет в проекте, зависит от необходимостей проекта.

zackscript 29.01.2017 20:11

Ну теперь ясно, а то я думал что только один объект создается и он является нечто особенным :D , спасибо Wolsh .
Кстати с прошедшим Вас :)

Добавлено через 2 часа 27 минут
Только начал а уже ошибка

Код AS3:

package 
{
        import flash.display.Sprite;
        import Main
 
        public class OtherClass extends Sprite
        {
 
                public function OtherClass ()
                {
                  Main.instance.message();
                }       
        }
}

Главный класс

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import OtherClass;
 
        public class Main extends Sprite
        {
                private static var _instance:Main;
 
                private var _txt:TextField;
                private var _other_class:OtherClass;
 
                public function Main()
                {
                        stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        if (_instance) throw new Error ("Class is singleton!");
 
                        _other_class = new OtherClass ()
                }
                public function message ():void
                {
                        _txt = new TextField()
                        _txt.text = "OK"
                        _txt.x = 400;
                        _txt.y = 300;
                        addChild (_txt);
                }
                static public function get instance ():Main
                {
                        if (!_instance) _instance = new Main ();
 
                        return _instance;
                }
 
        }
 
}


Wolsh 30.01.2017 00:31

У Вас же сначала [автоматически] создается экземпляр Мейн, но он НЕ записывается в переменную _instance.
Поэтому, когда _other_class обращается к геттеру instance(), тот создает новый экземпляр Мейн и записывает его в _instance. Итак, Вы уже получили 2 экземпляра Мейн, а это неправильно.

Добавлено через 6 минут
Цитата:

а то я думал что только один объект создается и он является нечто особенным
Именно так. Только один, и в этом его особенность.
Возможно, Вам надо как-то переформулировать первый вопрос, потому что изложен он очень путано.
Смысл синглтона именно и есть в том, что Класс не позволяет создавать более одного экземпляра ("объекта") ЭТОГО Класса. И дает доступ к этому экземпляру через свое статическое свойство. Поскольку сам Класс по определению может быть только один, то и его свойство ссылается точно на один экземпляр, откуда бы Вы к нему не обратились.

ZackMercury 30.01.2017 00:45

Цитата:

import Main
import OtherClass;
А в этом нет ошибки?

А какой смысл делать Main синглтоном вообще? Он ведь и так синглтон. Разве можно создать больше одного экземпляра Main?
Стало интересно, попробовал. Да, действительно возможно.

Код AS3:

package com.zackmercury.test
{
        import flash.events.Event;
        import flash.display.Sprite;
        /**
        * ...
        * @author ZackMercury
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        trace(1);
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        if (Math.random() > 0.5)
                                stage.addChild(new Main());
                }
 
        }
 
}

Код:

1
1

Как бы то ни было, не представляю, где это пригодится.
Мейн-синглтон. Он - корень проекта. Кто додумается создавать руками экземпляры Main за исключением внешних SWF?)

zackscript 30.01.2017 08:51

Цитата:

А какой смысл делать Main синглтоном вообще?
Это ради эксперимента , в действительности так не будет

Добавлено через 12 минут
Цитата:

а то я думал что только один объект создается и он является нечто особенным
Не-нет Вы меня не так поняли , я согласен что строго нужно создавать один экземпляр , просто я думал в singleton'е нельзя создавать ( более одного экземпляра ) и других классов.

Добавлено через 1 час 35 минут
Прошу помочь ибо я в логике в своем коде запутался.
По идее должен появится текст ну вот в чем подвох я не пойму, хотя и ошибок то нет.

Главный класс
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import OtherClassA;
        import OtherClassB;
 
        // author zackscript
 
        public class Main extends Sprite
        {
                private var _classA:OtherClassA;
 
                public function Main()
                {
                        stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);       
                }
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        this._classA = new OtherClassA ()
                        addChild (this._classA)
                }
        }
}

Класс А
Код AS3:

package 
{
        import flash.display.Sprite;
        import OtherClassB;
 
        public class OtherClassA extends Sprite
        {
 
                public function OtherClassA ()
                {
                  super();
 
                  OtherClassB.instance.message (); 
                }       
        }
}

Класс B

Код AS3:

package 
{
    import flash.display.Sprite;
        import flash.text.TextField;
 
    public class OtherClassB extends Sprite
        {
        private static var _instance:OtherClassB
 
                private var _txt:TextField;
 
        public function OtherClassB()
                {
            super();
 
            if (_instance) throw new Error("Class is singleton!");
        }
                public function message ():void
                {
                        _txt = new TextField ();
                        _txt.text = "Hello Main"
                        _txt.x = 400;
                        _txt.y = 300;
                        addChild (_txt);
                }
        static public function get instance():OtherClassB
                {
            if (!_instance) _instance = new OtherClassB ();
            return _instance;
        }
    }
}


callme 30.01.2017 12:10

поправил
Код AS3:

package 
{
    import flash.display.Sprite;
    import OtherClassB;
 
    public class OtherClassA extends Sprite
    {
 
        public function OtherClassA ()
        {
          super();
 
          OtherClassB.instance.message (); 
          addChild(OtherClassB.instance);
        } 
    }
}


zackscript 30.01.2017 12:18

Благодарю, я всегда думал что в классе А не надо добавлять в список отображения ведь это уже было проделано в классе В , но теперь я буду знать.


Часовой пояс GMT +4, время: 15:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.