Синглтон класс в Flex
У меня есть сомнения,.... Как бы вы создали класс Singleton во Flex...
Есть ли какое-либо соглашение, например, имя класса должно быть синглтонским или оно должно расширять любой другой класс.
Сколько классов Singleton может иметь проект?
Кто-нибудь может сказать в реальном времени об использовании класса Singleton?
Я планирую сохранить тексты для маркировки компонентов в классе Singleton... Это хороший подход.
5 ответов
Может червяков спрашивать о синглетонах!
Существует несколько различных вариантов создания синглетонов, в основном из-за того, что у AS3 нет частных конструкторов. Вот образец, который мы используем.
package com.foo.bar {
public class Blah {
private static var instance : Blah;
public function Blah( enforcer : SingletonEnforcer ) {}
public static function getInstance() : Blah {
if (!instance) {
instance = new Blah( new SingletonEnforcer() );
}
return instance;
}
...
}
}
class SingletonEnforcer{}
Обратите внимание, что класс SingletonEnforcer является внутренним, поэтому может использоваться только классом Blah (эффективно). Никто не может напрямую создать экземпляр класса, он должен пройти через функцию getInstance().
Надеюсь, что я не бью мертвых лошадей здесь:)
(edit: ааа, я просто повторяю ссылку phils)
Синглтонная реализация Gregors не защищает от вызова конструктора с нулевым значением, как в:
var b:Blah = new Blah(null);
У вас все еще будет только 1 экземпляр, но вызов конструктора все еще возможен со следующими последствиями.
Если вам абсолютно необходимо принудительно применять синглтон, конструктор должен убедиться, что параметр принудительное значение не равно нулю.
public function Blah( enforcer : SingletonEnforcer ) {
if(!enforcer){
throw new Error("whoops!");
}
}
Вы также должны быть обеспокоены ApplicationDomain при загрузке SWF-файлов. Внешние SWF-файлы, использующие те же определения, могут иметь несколько одноэлементных экземпляров (по 1 в каждом отдельном домене приложения), если вы не укажете, что SWF-файл должен быть загружен в существующий домен приложения.
Это означает, что Blah.getInstance() в AAA.swf не совпадает с экземпляром Blah.getinstance() в BBB.swf, если AAA.swf загружает BBB.swf без экземпляра LoaderContext, который сообщает плагину о загрузке BBB.swf в тот же ApplicationDomain, что и AAA.swf
Сначала вы можете сослаться на предыдущий вопрос, чтобы узнать, как создать одноэлементный класс. Вы также можете найти больше информации в презентации Якова Файна.
Второй вопрос, ваш проект может иметь одинаковый класс, как вы считаете нужным, но он будет создавать только 1 экземпляр каждого. Например, в архитектуре cairngorm у вас есть 3 основных синглета: контроллер, сервис и модель. Количество актуальных занятий может сильно зависеть от вашего проекта.
Наконец, решения реального мира будут. У вас есть 2 компонента, которые должны общаться друг с другом, но вы не хотите, чтобы они знали, что другой существует. Это означает, что иногда компоненты есть, а иногда их нет... поэтому вам нужно, чтобы они были слабо связаны. Вы можете использовать синглтоны для передачи данных из одного компонента в другой без непосредственного "разговора" с ними.
Использование синглетонов - это хороший подход, если вам нужно передавать данные по вашему приложению от компонента к компоненту и вы хотите отделить их друг от друга.
package com.foo.bar
{
public class MySingleton
{
private static var _instance:MySingleton = new MySingleton;
private var _myName:String;
public static function get instance():MySingleton
{
return _instance;
}
public function set myName(value:String):void
{
_myName = value;
}
public function get myName():String
{
return _myName;
}
}
}
Обратите внимание на отсутствие конструктора здесь.
Здравствуйте, вы можете проверить следующие примеры Flex Singleton Class на http://www.how-to-code.com/flex/flex-design-patterns/flex-singleton-class.html