单例模式:从简单实现到高级应用
立即解锁
发布时间: 2025-08-20 00:32:04 订阅数: 3 


ActionScript 3.0 设计模式精髓
### 单例模式:从简单实现到高级应用
#### 1. 简单单例模式概述
简单单例模式在大型项目中经常被使用。其核心思想是确保一个类只有一个实例,并提供一个全局访问点。客户端是简单单例的信使,需要预先了解抽象产品,同时要知道静态类的全限定名及其静态方法。
简单单例模式可用于从一个对象的命名空间全局访问另一个对象,常被用于与外壳或模型的主要部分进行通信,如声音管理或跟踪。
#### 2. 简单单例模式示例
以一个RIA应用中使用用户Facebook资料为例,当前用户资料仅在当前类中可访问。以下是相关代码:
```actionscript
package
{
public class FaceBookLogin extends EventDispatcher
{
protected var _faceBook : IFaceBook;
protected var _shortProfile : ShortProfileInformation;
private var _hasProfile : Boolean = false;
private var _ready : Boolean;
public function FaceBookLogin( target : IEventDispatcher = null )
{
super( target );
_ready = false;
_shortProfile = new ShortProfileInformation();
}
public function init() : void
{
_ready = false;
_faceBook = new FaceBookFacade();
_faceBook.addEventListener( FacebookEvent.CONNECT , faceBookConnectHandler , false , 0 , true );
}
public function get facebook() : IFaceBook
{
return _faceBook;
}
public function get hasProfile() : Boolean
{
return _hasProfile;
}
public function get shortProfile() : ShortProfileInformation
{
return _shortProfile;
}
protected function faceBookConnectHandler( event : FacebookEvent ) : void
{
if (event.success)
{
FacebookCall( _faceBook.queryUserInformation() ).addEventListener( FacebookEvent.COMPLETE , userInfoLoaded );
dispatchEvent( new FacebookEvent( FacebookEvent.CONNECT, false, false ) );
}
}
protected function userInfoLoaded( event : FacebookEvent ) : void
{
var aFaceBookCall : FacebookCall = event.target as FacebookCall;
aFaceBookCall.removeEventListener( FacebookEvent.COMPLETE , userInfoLoaded );
dispatchEvent( new FacebookEvent( FacebookEvent.COMPLETE , false , false ) );
var profile : ProfileInformation = _faceBook.getUserProfile();
_shortProfile.usrIdentifier = profile.userName;
_shortProfile.faceBook = true;
_hasProfile = true;
}
}
}
```
为了让这些信息在整个网站中可用,并更新当前文本字段,可使用简单单例模式。具体做法是使用一个类成员来保存对象实例化的内存指针,代码如下:
```actionscript
public static var _fbReference:FaceBook;
// This class member will hold any subclass of Facebook
FaceBook.fbReference = new FaceBook();
```
为了限制对象修改`_fbReference`的能力,可将静态变量声明为私有,并使用getter方法供外部对象获取引用。但为了能对其进行子类化,可将访问修饰符设置为受保护。
为确保`FaceBook`实例只创建一次,可使用以下代码:
```actionscript
package
{
public class FaceBook extends FaceBookLogin
{
static protected var $_fbInstance : FaceBookLogin;
public function FaceBookA( target : IEventDispatcher = null )
{
super( target );
}
static public function getInstance() : FaceBookLogin
{
if ($_fbInstance)
{
$_fbInstance = new FaceBook();
}
return $_fbInstance;
}
}
}
```
使用`getInstance`方法可获取`FaceBook`对象的唯一实例,代码如下:
```actionscript
FaceBook.getInstance()
```
以下是使用`FaceBook.getInstance`的类示例:
```actionscript
private var _faceBook : FaceBook
override public function intro() : void
{
_faceBook = FaceBook.getInstance();
trace( "_faceBook" , _faceBook );
var _userInfo : ProfileInformation = _faceBook.getUserProfile();
trace( "_userInfo" , _userInfo );
var obj : Object = _userInfo.fullProfile;
for (var key:String in obj)
{
trace( key + ' ' + obj );
}
if (!_faceBook.hasProfile)
{
_faceBook.addEventListener( FacebookEvent.COMPLETE , updateTextFields );
}
else
{
// ... text fields update implementation not shown.
}
// ... truncated code
}
```
#### 3. 简单单例模式的问题
当项目需要修改,如添加用户资料图片和随机更新时,创建了`FaceBookExtendedProfile`子类。但简单单例模式在子类化时存在问题,因为它引用了具体的类对象,导致代码缺乏灵活性。
以下是`FaceBookExtendedProfile`的代码:
```actionscript
package
{
public class FaceBookExtendedProfile extends Facebook
{
public function FaceB
```
0
0
复制全文
相关推荐










