![]() |
Реализация шаблона singleton в AS3
Посмотрите пожалуйста код. Вы используйте в своем коде шаблон "одиночка" или делаете это как-то подругому?
т.е. это объект, который (по-хорошему) может быть интсанциирован только один раз через метод getInstance() Код:
public class RegistrationManagerProxy { |
Ваш класс не должен компилироваться, конструкторы обязаны быть public. Я просто делаю у конструкртора обязательный аргумент типа, который может быть найден только в классе находящемся в одном файле с "одиночкой", но это одно из решений. А вообще, можно поискать по форуму, пару месяцев назад была дискуссия на эту тему с массой примеров.
|
|
BloodHound >> Давно стало интересно, может ты сможешь объяснить. В чем необходимость использования подобной конструкции ("одиночка")??
Сколько не думал, так и не нашел применения... |
ulik, не понял :) это вопрос ко мне? или моя цитата?
|
Это вопрос к тебе :)
|
ulik, честно? это на столько редкая необходимость, что у нас в проектах пока что нигде не пригодилась. в основном мы используем мультитон. даже адоба почему-то не стала делать синлтон из всем известного класса ExternalInterface.
почему ExternalInterface должен быть всегда один? потому что контэйнер у флэшки всегда один. пример ХТМЛ-страница. пример использования синглтона такой: 1. допустим есть некий интерфейс IConnection, который объеденяет в некое множество классов. и ExternalInterface один из них. Код:
public final class ExternalInterface implements IConnection {Код:
public final class ExternalInterface extends EventDispatcher {1. колбэк тоже должен быть единсвенный, поэтому наследование от диспатчера не нужно. 2. имплементация интерфейса тоже не нужна. так как его не с чем объеденять. ShareObject - вполне заслуженный мульти тон. резюме по поводу данного топика: тут синглтон даже близко не нужен. |
Угу. Спасибо. Просто я уже не раз видел "обсуждение сингла" и даже пробовал сделать "тест" проект, чтобы его задействовать, но так и не смог найти именно тот случай, где нужен "класс-сингл". Да и на моем опыте не было пока необходимости в подобном. Другое дело - мультитон. Тут проще :)
|
Вот, на мой взгляд, уместная реализация синглтона. Почему именно синглтон? - потому, что он общается не напрямую с получателем/отправителем информации, а через менеджер. У менеджера есть еще около 7-8 вариантов получения внешней информации, которая должна выглядеть одинаково для получателей. Т.е. в данном случае я посылаю картинки, но, я могу те же картинки получить не из сокета, а просто загрузив с диска или распарсив информацию получаемую из другого URLStream'a и т.п. получателей информации может быть неопределенное количество, сокет может сменить порт и ИП в процессе работы, но получателя информации это не должно волновать - поэтому менеджер создает его 1 раз и на всегда.
(упрощенный вариант) Код:
/** |
wvxvw, а что с английским? :)
|
А что? фз... я еще не дожил спелчекером код проверять =) Вроде обычно более менее грамотно пишу... ну так на первый взгляд никаких ошибок не обнаружил? Что не так? =)
|
Цитата:
|
Ааааа.... млин, ну, опечатался, ща поправлю =)
|
Олег, любые конекшины впринципе не могут являться сингтонами. ведь их может быть много одинаковых, но на разные домены, или сразными настройками. в общем завтра когда руководство скажет тебе, что по новому сокету тебе надо получаться постояные коментарии к первому потоку, ты подумаешь, а нафига я сделал синглтон?
|
не, не скажет, моя флешка - часть большого проекта, в котором это взаимодействие описано. По техническим причинам она не сможет коннектится к >2 сокетам. Так устроена остальная часть, которая от меня не зависит. Это одно из соображений оптимизации, и оно очень важно в моем случае. Т.е. флешка запускается локально на сервере (не пользователем, а таском), но тредов запустивших флешку может быть много (т.е. будет запущено много копий флешки). Так что запустить +1 сокет для каждой копии (каждого нового треда) - на это никто не пойдет...
|
wvxvw, скажи, а методы connect и close могут вызывать кто угодно и где угодно?
синглтон в твоём случаи должен ограничить разработчика от нежелательный действий с соединением. твоё соединение теоретически одно. заметь только теоретически, но закрыть его или открыть может кто угодно и откуда угодно. нафига тут синглтон? :) |
Это не полное содержание класса =) он на самом деле на много больше, connect и close никто не может вызвать, просто в примере это не описано.
Просто, представь, что с другой стороны могло бы быть: имеется пару десятков отправителей, которые должны посылать в один единственный сокет - а у каждого из них своя копия этого сокета, и кому это нужно придумывать как сделать синхронизацию и предотвращение конкурентных обращений? А так, каждый, кто хочет чего-то послать ломится по одному и тому же адресу. Если посылать не успеваем - строим очередь, ну и т.д. |
дело не в копиях :) дело в том, что завтра надо будет второй такой же класс. чё делать? писать ещё один синглтон?
|
Вероятность необходимости еще одного такого же класса, с таким же функционалом практически равна 0... т.е. предположим, что в ближайший год производительность серверов в среднем увеличится в 2 раза (уже как-то стремно =), ну ок, и мы решим задействовать открывшийся ресурс для того, чтобы прицепить туда еще 1 сокет (ну, не так уж много это и занимает, в конце концов =), но, что он будет делать? Сокет-отправитель уже есть, сокет-получатель - тоже. Приложение должно выполнять 2 операции: получать и посылать. Чего бы еще ему такое придумать? - Я вижу вариант только такой: в рандомально выбраное время откывать дверцу сидирома и загробным голосом произносить "my preeeeecioussssss.....". :D
|
Олег :) у нас в проектах обычно минимум 2 сокета. хотя можно конечно загрузить всё в один. а ещё можно использовать один сервер, где надёжнее использовать 4.
ты мне вот скажи зачем там нужен синглтон? Цитата:
|
Ну, так задачи ж разные =) у меня в задаче не может быть даже гипотетически больше 2 сокетов, а у вас - да. Кроме того, я ж в начале написал, что к сокету напрямую обращается только менеджер, а получатели "не знают" откуда берется информация. Т.е.
Код:
[а] "пришли картинку" ---| [источник картинок] |
это почему на флэшке должен быть один сокет?
|
аааааа =))) нет, должно быть ровно 2, но разных, а больше быть не должно =) Т.е. как можно догадаться из названия класса есть еще и SocketSender =)
Короче, писал-писал, и все стер =) Вобщем, представь, тебе налили 10 тарелок супа, но нафик тебе для этого 10 ложек? Конечно, можно извратится и позапихивать их как-нть между пальцами, но есть от этого верняк удобнее не станет =) Не знаю, если ты считаешь, что удобнее это было реализовать через статические методы - ну, я думаю, что это дело вкуса. Мне просто так удобнее. =) |
wvxvw, зачем статические методы? твой синглтон это те же "статические методы" только вид сбоку и запись длинее.
а почему 2? а я говорю 3!!! нет! даже 4! откуда такие ограничения? зачем вообще их считать? зачем думать сколько их? зачем вообще думать что они из себя предстваляют? P.S.: Денис, спаси меня :) я не могу объяснить, а ты могуч :) |
Потому что больше не надо - ну нечего мне с ними делать =) ну, попробуй сесть сразу на 4 стула =)
ЗЫ. запись вида SocketSender.getInstance() встречается в коде ровно 1 раз... при чем была технично вставлена автокомплитом! %) я ее даже не писал =) |
Цитата:
В общем, соединений может быть сколько угодно, причем с ними работают разные контроллеры и прочие вещи, которые могу быть совершенно не связаны друг с другом. Причем тут 10 ложек — совершенно неясно :) |
Да потому что в моей конкретной задаже есть Н тарелок с супом, а скушать их должен 1 человек =) Если вы ему для этого дадите Н ложек, где Н много блольше 1, он просто растеряется, и станет их использовать не по назначению =)
|
Цитата:
|
уууууууууу.... ну я не знаю как еще объяснить: если возникнет необходимость в других соединениях, то они не будут выполнять ту же функцию, что и первые 2, соответственно, для них нужен будет другой коннектор. Но ситуация, кроме всего такова, что не возникнут, потому что даже теоретически они там не нужны. Результат работы приложения может, и не просто может, он обязан быть единственным, поэтому 2 сокета принимающие результат не нужны по определению. Такое вот назначение у приложения. Но если бы ему нужно было выслать результат работы множеству получателей - тогда бы я согласился, что синглтон тут неуместен. Но это было бы уже другое приложение.
|
wvxvw, кароче. у тебя синглтон ради сингтона, а не от необходимости.
ты приплёл синглтон, когда тебе всего лиш "нужен один" конекшен, а не он "должен быть один". надеюсь я доходчиво объяснил? |
Вставлю свои 5 копеек, уворачиваясь от вил.
Существует архитектура "пирога", которая предполагает использование нескольких програмных слоев, на каждом из которых реализуется определенная логика. Ее я и решил применить в флэш-проекте на AS3. 1) Я отнаследовал Main.as от MovieClip 2) Я создал класс RegistrationForm и повесил listener на кнопку registrationButton 3) В callback методе я использовал RegistrationManager.getInstance().register() Но это действительно не лучший пример, так как класс RegistrationManager используется один раз при регистрации юзера. Заменим его на класс ApplicationManager который будет общаться с сервером вызывая методы NetConnection.call и получая callbacks. Фактически, этот класс будет оберткой NetConnection и он должен быть единственным, т.к. нужен только один коннект к медиа серверу. В чем здесь неоправданное использование шалона "одиночка"? Как этот функционал реализовать по другому? |
BlooDHounD:
Если он мне нужен всего один, то я и буду делать всего один, зачем мне 2 одинаковых? В этом и задача синглтона - намерено не дать создать другой такой же объект... Конекшн уникальный по своим параметрам, и другого такого как он быть не может, потому что второму такому делать нечего будет. А нужен будет еще один, но с другим функционалом - так я и создам другой... Alexander Balaganov: Собственно, наш спор до этого был о том, что лучше использовать: Manager.someStaticMethod(); или Manager.getInstance().someMethod(); Мое мнение такое, что если удобнее пользоваться методами объекта, у которого нужно вызвать метод (например, нам его нужно унаследовать от EventDispatcher, чтобы можно было рассылать события из него, а не через какoе-нибудь опять же статическое свойство хранящее ссылку на экземпляр EventDispatcher, то, мое мнение, что удобнее использовать синглтон. Но если класс ни от чего наследовать не нужно, то проще обойтись статическими методами. |
пример:
1. есть хитрый класс обрабатывающий соединение. ему для работы нужен сериализатор; 2. есть сериализатор. ему для работы нужны параметры сереализации; 3. нужно сделать игровой поток, и чатовый поток. оба потока в принципе работают можно объединить в один, но мы хотим их развивать независимо; 4. мы берём хитрое соединение, сереализатор, меняем параметры, получаем соединение; каждого соединение существует по одному. логично! зачем нам 2 чатовых соединения? из вашей логики мы должны сделать следущие: 1. сделать синглтон-класс ChatConnection; 2. сделать сингтонр-класс GameConnection; вроде бы всё лочгично, но зачем? ведь два класса будут отличать только парметрами серелизатора. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Млин, короче... я не хочу спорить... ты все не правильно понял, ну да ладно, не важно.
|
Цитата:
Какие страсти-то разыгрались - брррр... :) А инициатором был я :quiet: В ЭтогЕ, я так, честно говоря, и не нашел именно "синглтон случая", когда без него, ну, никуда. Облазил весь инет - пока что-то жесткой необходимости в классе-сингле не нашел. Возможно, сам пойму, когда столкнусь с такой задачей, где именно он нужен будет... |
| Часовой пояс GMT +4, время: 00:22. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.