سؤال

نظرًا لأن AS3 لا يسمح بمنشئات خاصة، فيبدو أن الطريقة الوحيدة لإنشاء وحدة مفردة وضمان عدم إنشاء المُنشئ بشكل صريح عبر "جديد" هي تمرير معلمة واحدة والتحقق منها.

لقد سمعت توصيتين، إحداهما هي التحقق من المتصل والتأكد من أنه getInstance() الثابت، والأخرى هي أن يكون لديك فئة خاصة/داخلية في نفس مساحة اسم الحزمة.

يبدو أن الكائن الخاص الذي تم تمريره إلى المُنشئ هو الأفضل، لكن لا يبدو أنه يمكنك الحصول على فئة خاصة في نفس الحزمة.هل هذا صحيح؟والأهم من ذلك هل هي أفضل طريقة لتنفيذ المفردة؟

هل كانت مفيدة؟

المحلول

التعديل الطفيف لإجابة enobrev هو أن يكون لديك مثال كـ getter.قد يقول البعض أن هذا أكثر أناقة.كما أن إجابة enobrev لن تفرض Singleton إذا اتصلت بالمنشئ قبل الاتصال بـ getInstance.قد لا يكون هذا مثاليًا، لكنني قمت باختباره وهو يعمل.(هناك بالتأكيد طريقة جيدة أخرى للقيام بذلك في كتاب "Advanced ActionScrpt3 with Design Patterns" أيضًا).

package {
    public class Singleton {

    private static var _instance:Singleton;

    public function Singleton(enforcer:SingletonEnforcer) {
        if( !enforcer) 
        {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
        }
    }

    public static function get instance():Singleton
    {
        if(!Singleton._instance)
        {
            Singleton._instance = new Singleton(new SingletonEnforcer());
        }

        return Singleton._instance;
    }
}

}
class SingletonEnforcer{}

نصائح أخرى

لقد كنت أستخدم هذا منذ بعض الوقت، وأعتقد أنني حصلت عليه في الأصل من ويكيبيديا من جميع الأماكن.

package {
    public final class Singleton {
        private static var instance:Singleton = new Singleton();

        public function Singleton() {
            if( Singleton.instance ) {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
            }
        }

        public static function getInstance():Singleton {                
            return Singleton.instance;
        }
    }
}

وهنا ملخص مثير للاهتمام للمشكلة، مما يؤدي إلى حل مماثل.

يمكنك الحصول على فصل خاص مثل هذا:

package some.pack
{
  public class Foo
  {
    public Foo(f : CheckFoo)
    {
      if (f == null) throw new Exception(...);
    }
  }

  static private inst : Foo;
  static public getInstance() : Foo
  {
     if (inst == null)
         inst = new Foo(new CheckFoo());
     return inst;
  }
}

class CheckFoo
{
}

النمط الذي تستخدمه Cairngorm (والذي قد لا يكون الأفضل) هو طرح استثناء وقت التشغيل في المنشئ إذا تم استدعاء المنشئ مرة ثانية.على سبيل المثال:

public class Foo {
  private static var instance : Foo;

  public Foo() {
    if( instance != null ) { 
      throw new Exception ("Singleton constructor called");
    }
    instance = this;
  }

  public static getInstance() : Foo {
    if( instance == null ) {
      instance = new Foo();
    }
    return instance;
  }

}    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top