谈谈java和actionscript中的单例模式

大家都知道java和actionscript都是面向对象的,而且相信大家也都知道一些面向对象的设计模式,下面主要针对单例模式在这两种语言中的实现做个简单的比较。
首先我们知道java中的构造函数的访问权限是可以有3种的,public,protected,public,但是我们要实现单例模式,通常我们不把它设为public类型的,通常设置为protected或private类型,也许有人会觉得就只应该设置为private类型。不要急,我这里设置为protected类型主要是为了能让子类能继承,使子类能够依靠父类实例化。在java中主要有三种设计方法,第一种是饿汉式单例类,代码实现类似如下:

package Singleton.eager;

public class EagerSingleton {
private static final EagerSingleton m_instance=new EagerSingleton();

private EagerSingleton(){

}
public static EagerSingleton getInstance(){
return m_instance;
}

}

在此类中,主要是在这个类被加载时静态变量会被初始化,此时唯一的对象就创建出来了哈。
第二种是懒汉式单例类,代码实现如下,也是我们最常用方法:

package Singleton.lazy;

public class LazySingleton {
private static LazySingleton m_instance=null;

private LazySingleton(){

}

synchronized public static LazySingleton getInstance(){
if(m_instance==null){
m_instance=new LazySingleton();
}
return m_instance;
}

}

在这种方式中只有当我们在第一次调用了getInstance()方法时才创建唯一实例,同时我们用了关键字synchronized,主要是为了适应多线程环境。
最后的话是所谓的登记式单例模式,示例代码如下:

package Singleton.reg;

import java.util.HashMap;

public class RegSingleton {
private static HashMap m_registry=new HashMap();
static{
RegSingleton x=new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}

protected RegSingleton(){

}

public static RegSingleton getInstance(String name){
if(name==null){
name="Singleton.reg.RegSingleton";
}
if(m_registry.get(name)==null){
try{
m_registry.put(name, Class.forName(name).newInstance());
}catch(Exception e){
System.out.println("Error happended");
}
}
return (RegSingleton)(m_registry.get(name));
}

public String about(){
return "Hello,I am RegSingleton";
}

}

这一方法克服了前面两种不可继承的缺点,接着我们看看它的子类的一个例子:
package Singleton.reg;

public class RegSingleChild extends RegSingleton {

public RegSingleChild(){

}
public static RegSingleChild getInstance(){
return (RegSingleChild)RegSingleton.getInstance("Singleton.reg.RegSingleChild");
}

public String about(){
return "Hello,I am RegSingleChild";
}

}

由于我们这的子类必须允许父类以构造函数调用产生实例,因此我们这里的子类的构造函数必须是public类型的。
接下来我们再来谈谈actionscript中的单例模式的实现,我们都知道在actionscript3.0中,构造函数都必须是public类型的,不能为private类型的,也不能有多个构造函数,因此我们不能像java那样建立单例模型,但是我们考虑到参数类型,如果我们的构造函数带有参数,而且指定类型的话,并且这种类型只有在同一个文件中才能访问的话,那么我们就可以做到只建立单例模型了,很幸运的是,在actionscript3.0中,我们的单个文件允许在包外创建类和方法,因此我们可以利用此来实现as中的单例模型,代码如下:
package org.rjb.model
{
import com.adobe.cairngorm.model.ModelLocator;

import mx.collections.ArrayCollection;

[Bindable]
public class UserModelLocator implements ModelLocator
{
private static var modelLocator:UserModelLocator;
public var userModel:AddUserModel=new AddUserModel();
public var userCollection:ArrayCollection=new ArrayCollection();
public static function getInstance():UserModelLocator{
if(modelLocator==null){
modelLocator=new UserModelLocator(new SingletonEnforcer());
}
return modelLocator;
}
public function UserModelLocator(enforcer:SingletonEnforcer) {
if (enforcer == null) {
throw new Error( "You Can Only Have One UserModelLocator" );
}
}
}
}
// Utility Class to Deny Access to Constructor
class SingletonEnforcer {}

好了,代码展示以及简单的说明就到此了,希望这些能帮您更好的理解设计模式中的单例模式,在今后的文章中也会对比其他设计模式在这两种语言中的异同及实现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值