2012-06-26 3 views
0

Это хорошо работает как Singleton в ActionScript? т.е. есть ли какие-либо проблемы, о которых я должен знать, и верно ли, что в этом случае будет создан только один экземпляр AVManager:Очень простой синглтон?

Обратите внимание, что я получаю ожидаемый результат (только одно время «созданного экземпляра в первый раз» и номера соответствуют последовательности):

экземпляров впервые! 1

FILE 1: 2

FILE 2: 3

и, наконец, 4

Здесь находятся файлы ....

AV_CONFIG.as:

package { 
    public class AV_CONFIG { 
     public static var AVM:AVManager = new AVManager(); 
    } 
} 

AVManager.as:

package { 
    import flash.events.EventDispatcher; 

    public class AVManager extends EventDispatcher { 
     public var someConstantData:uint = 1; 

     public function AVManager() { 
      trace('instantiated first time!', someConstantData); 
     } 

    } 
} 

Тогда:

File1.as:

package { 
    import AV_CONFIG; 
    import flash.display.Sprite; 

    public class File1 extends Sprite { 

     public function File1() { 
      AV_CONFIG.AVM.someConstantData++ 
      trace('FILE 1:', AV_CONFIG.AVM.someConstantData); 
     } 

    } 
} 

File2.as:

package { 
    import AV_CONFIG; 
    import flash.display.Sprite; 

    public class File2 extends Sprite { 

     public function File2() { 
      AV_CONFIG.AVM.someConstantData++ 
      trace('FILE 2:', AV_CONFIG.AVM.someConstantData); 
     } 

    } 
} 

Main.as (The DocumentClass):

package { 
    import AV_CONFIG; 
    import flash.display.Sprite; 

    public class Main extends Sprite { 

     public function Main() { 
      var f1:File1 = new File1(); 
      var f2:File2 = new File2(); 
      AV_CONFIG.AVM.someConstantData++ 
      trace('and finally', AV_CONFIG.AVM.someConstantData); 
     } 

    } 
} 

ответ

7

Вообще с одноплодной вы хотите:

  1. Limit или растворять способность создавать экземпляры этого класса.
  2. Создайте средство для получения экземпляра этого класса статически.

Пример:

public class AvManager 
{ 

    private static var _instance:AvManager; 
    internal static var created:Boolean = false; 

    public function AvManager() 
    { 
     if(AvManager.created) 
     { 
      throw new Error("Cannot created instances of AvManager, use AvManager.instance."); 
     } 

     AvManager.created = true; 
    } 

    public static function get instance():AvManager 
    { 
     if(_instance == null) 
     { 
      _instance = new AvManager(); 
     } 

     return _instance; 
    } 

    public function test():void 
    { 
     trace("Working."); 
    } 

} 

Где можно теперь использовать:

AvManager.instance.test(); // Working. 
1

Да это работает отлично, другой способ положить AVManager прямо в своем собственном файле класса на вершине:

private static var AVM:AVManager = new AVManager(); 

и получить его в случае необходимости с помощью функции в классе AVManager, как это:

public static function GetInstance():AVManager { 
    return AVM; 
} 

Эта настройка не нужна, но обеспечивает небольшую защиту, запрещая прямой доступ.

Удачи вам в вашем проекте.

0

Смотрите этот код как попытку для создания чего-то другого.

в AS3 Другим Singleton:

Первый Interface:

package test { 
public interface Foo { 

    function func0():void; 

    function func1(arg:String):String; 


} 
} 

а затем Singleton:

package test { 
public class BASIC_FOO { 
    public static const BASIC_FOO:Foo = new BasicFoo(); 
} 
} 

import test.Foo; 

class BasicFoo implements Foo { 

    public function func0():void { 
    } 

    public function func1(arg:String):String { 
     return arg; 
    } 
} 
+2

Что такое Singleton, который реализует интерфейс? Невозможно обеспечить альтернативную реализацию, поскольку клиенты извлекают конкретный экземпляр процедурно, а не предоставляют ему. –

+0

ok ... тогда вы могли бы заменить «const» на функцию, нет? – OXMO456

+0

Он использует const для обеспечения глобального доступа, который является антитезой OOP, но я думаю, что const будет работать лучше, чем вызов статической функции, если вы хотите, чтобы мое честное мнение о том, какая форма цианида делает самый здоровый завтрак. –

2

Самый большой Гоча является allowing global access to something if its state can be changed. Если это проект, в котором вы ожидаете, что кодовая база будет поддерживаться дольше недели или около того, и вы думаете, что у нее, вероятно, будет более 500 строк кода, я бы настоятельно предложил избежать этого - я могу рассказать вам по опыту что в большом проекте трудно понять, какая из сотен классов, имеющих доступ к вашему Синглтону, изменила его состояние, которое вызывает данную ошибку.

Далее требования имеют способ изменения. Что делать, если вам вдруг понадобится 2 AVManager? Вы обнаружите, что вы создали так много ссылок на ваш статический, что его изменение приведет к удалению всего проекта. Опять же, я говорю из опыта здесь. Если вы используете инъекцию зависимостей (это просто пугающий способ сказать, что классы, которым нужен AVManager, имеют свойство, заполняемое извне), эти типы изменений становятся легкими ... просто дайте им другой AVManager, сделанный.

И, наконец, если у вас есть какие-либо претензии на необходимость разработки Test Driven Development, использование globals/statics таким образом сделает весь этот код неустойчивым. Вы не можете предоставить альтернативный AVManager для тестирования, поскольку все классы с зависимостью от него жестко привязаны, чтобы получить этот конкретный.

Удачи вам!