|
|
|||||
паттерн [Singleton]
Google говорит:
Цитата:
Конечно же я не говорю что бы все объекты создавать так что'б иметь точку доступа из любого места а лишь те которые действительно нужны. p.s. У меня такое ассоциация складывается что Singleton должен создавать строго один объект класса, так что, кто что скажет ? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Если я правильно понял вопрос, то ответ: можете оформлять как синглтон хоть один, хоть пять, хоть все классы, если надо.
"Паттерн" не означает, что ему подчиняется весь проект. Это просто шаблон решения какой-то задачи. В данном случае это просто способ организовать синглтон. Синглтон это не всё приложение. Это всего-лишь один объект, который должен отвечать определенным требованиям, чтобы реализовать синглтон. А сколько таких объектов разных классов будет в проекте, зависит от необходимостей проекта.
__________________
Reality.getBounds(this); |
|
|||||
Ну теперь ясно, а то я думал что только один объект создается и он является нечто особенным , спасибо Wolsh .
Кстати с прошедшим Вас Добавлено через 2 часа 27 минут Только начал а уже ошибка package { import flash.display.Sprite; import Main public class OtherClass extends Sprite { public function OtherClass () { Main.instance.message(); } } } 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; } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У Вас же сначала [автоматически] создается экземпляр Мейн, но он НЕ записывается в переменную _instance.
Поэтому, когда _other_class обращается к геттеру instance(), тот создает новый экземпляр Мейн и записывает его в _instance. Итак, Вы уже получили 2 экземпляра Мейн, а это неправильно. Добавлено через 6 минут Цитата:
Возможно, Вам надо как-то переформулировать первый вопрос, потому что изложен он очень путано. Смысл синглтона именно и есть в том, что Класс не позволяет создавать более одного экземпляра ("объекта") ЭТОГО Класса. И дает доступ к этому экземпляру через свое статическое свойство. Поскольку сам Класс по определению может быть только один, то и его свойство ссылается точно на один экземпляр, откуда бы Вы к нему не обратились.
__________________
Reality.getBounds(this); |
|
|||||
Цитата:
А какой смысл делать Main синглтоном вообще? Он ведь и так синглтон. Разве можно создать больше одного экземпляра Main? Стало интересно, попробовал. Да, действительно возможно. 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()); } } } Мейн-синглтон. Он - корень проекта. Кто додумается создавать руками экземпляры Main за исключением внешних SWF?)
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 30.01.2017 в 01:04. |
|
|||||
Цитата:
Добавлено через 12 минут Цитата:
Добавлено через 1 час 35 минут Прошу помочь ибо я в логике в своем коде запутался. По идее должен появится текст ну вот в чем подвох я не пойму, хотя и ошибок то нет. Главный класс 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) } } } package { import flash.display.Sprite; import OtherClassB; public class OtherClassA extends Sprite { public function OtherClassA () { super(); OtherClassB.instance.message (); } } } 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; } } } Последний раз редактировалось zackscript; 30.01.2017 в 12:03. |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
поправил
|
|
|||||
Благодарю, я всегда думал что в классе А не надо добавлять в список отображения ведь это уже было проделано в классе В , но теперь я буду знать.
|
Часовой пояс GMT +4, время: 21:33. |
|
« Предыдущая тема | Следующая тема » |
|
|