AS3中的单件(Singleton)模式
单件(singleton)模式在c#中是最容易实现的模式,其主要用意就在于限制使用者用new来创建多个实例。但在as3中,构造函数必须是public的(语法本身要求的),而且也不能在构造函数中抛出异常(编译可通过,但是逻辑行不通),因为这样相当于把创建实例的路子完全切断了,一个实例也得不到!
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
错误代码:
package{
public class singleton{
static private var _instance:singleton;
public function singleton():void{
throw Error("单件模式不能用new创建实例!");
}
public static function getInstance():singleton{
if (_instance==null){
_instance = new singleton();//因为上面的构造函数抛出了异常,所以这里运行时会报错
}
return _instance;
}
}
}
怎样即能创建实例,又阻止使用者调用构造函数呢?这里要用到as3的一个特性:默认情况下,一个as文件,只能放一个类,而且必须用package声明,但有一种特殊情况:一个as文件中定义二个类,一个用package声明,一个不用!没有package的类,默认访问范围为“仅同在一个文件的类可访问”
package
{ public class SingletonFactory
{
private static var _instance:Singleton2=null; public function SingletonFactory():void
{
trace Error("error!");
} public static function getInstance():Singleton2
{
if (_instance == null)
{
_instance=new Singleton2();
}
return _instance;
}
}
} class Singleton2
{
import flash.utils.getTimer; private var _createTime:uint; public function Singleton2()
{
_createTime=getTimer();
} public function toString():String
{
return "本实例的创建时间:" + _createTime.toString();
} public function helloWorld(name:String):String
{
return "hello " + name + " !";
}
}
测试:
package
{
import flash.display.Sprite;
import flash.utils.getTimer; public class main extends Sprite
{
public function main()
{
var a:* = SingletonFactory.getInstance();
trace(getTimer()); var s1:* = SingletonFactory.getInstance();
trace(s1.toString()); //空循环,刻意占用cpu,消耗占时间而已
for(var i:uint=0;i<999999;i++)
{
//trace();
} trace(getTimer());
var s2:* = SingletonFactory.getInstance();
trace(s2.toString()); trace(s1==s2); trace(s1.helloWorld("jimmy")); }
}
}
但这里有一个不爽的地方,SingleTon2类离开了文件SingletonFactory.as就无法访问了,所以我们在使用时,只能用var s1:* 来声明,虽然可以使用,但是在fd,fb等编程环境中却无法获得代码自动感知!
可以借助接口改进一下:
package
{
public interface ISingleton
{
function toString():String; function helloWorld(name:String):String;
}
}
然后让SingleTon2实现该接口
package
{ public class SingletonFactory
{
private static var _instance:Singleton2=null; public function SingletonFactory():void
{
trace Error("error!");
} public static function getInstance():Singleton2
{
if (_instance == null)
{
_instance=new Singleton2();
}
return _instance;
}
}
} class Singleton2 implements ISingleton //这里改为实现接口
{
import flash.utils.getTimer; private var _createTime:uint; public function Singleton2()
{
_createTime=getTimer();
} public function toString():String
{
return "本实例的创建时间:" + _createTime.toString();
} public function helloWorld(name:String):String
{
return "hello " + name + " !";
}
}
重新测试:
package
{
import flash.display.Sprite; public class main extends Sprite
{
public function main()
{
var s:ISingleton=SingletonFactory.getInstance();
trace(s.helloWorld("jimmy.yang"));
}
}
}
当然明白了上面的原理后,其实可以更一步简化,既然不声明package的类,只能限制在同一个文件内部的其它类可以访问,何不把它做为构造函数的参数?(这样不就限制了从外部调用构造函数么)
package
{
public class Singleton2
{
private static var _instance:Singleton2; public function Singleton2(n:_nothing)
{ } public static function getInstance():Singleton2{
if (_instance==null){
_instance = new Singleton2(new _nothing());
}
return _instance;
}
}
} class _nothing{}
这样就清爽多了,当然Singleton模式在AS3中的实现方法不止一种,下面这种也许更容易理解:
package{
public class Singleton{
private static var _instance:Singleton = null;
public function Singleton(){
if(_instance == null){
_instance = this;
}else{
throw Error("已经存在该类的实例!");
}
}
public static function getInstance():Singleton{
if(_instance != null){
return _instance;
}
return new Singleton();
}
}
}
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
AS3中的单件(Singleton)模式的更多相关文章
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- js中singleton模式解析及运用
singleton模式,又名单例模式.顾名思义,就是只能实例化一次的类(javascript中没有真正的类,我们通常用函数来模拟类,习惯称之为"伪类").具体地说,singleto ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- .net core 注入中的三种模式:Singleton、Scoped 和 Transient
从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...
- JAVA中实现单例(Singleton)模式的八种方式
单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 基本的实现思路 单 ...
- 1.设计模式 - Singleton模式(单件模式)
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点,一般用于Activity的控制层全局对象和Singl ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- 懒人模式Singleton模式Meyers版本号
直接看代码: /* Singleton模式保证:在一个程序,,一个类有且只有一个实例.并提供一个访问 它的全局访问点 在编程其中.很多情况下,需要确保有一类的一个实例 比如: windopws系统中仅 ...
- C++完美实现Singleton模式[转]
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情.1. 标准的实现class Singleton{public: static Singleton * ...
随机推荐
- nodeJS网络操作
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, ...
- CCF-20170903-JSON查询
这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!! 后来重现写了一下--(110行超级麻烦 主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对 ...
- 无状态http协议上用户的身份认证
1.注册时可以使用手机短信验证码进行身份认证 2.用户每次请求不能每次都发送验证码,这时需要服务器给客户端颁发一个身份凭证(一般为一个唯一的随机数),用户每次请求时都携带身份凭证, 服务器会记录该身份 ...
- PythonStudy——算术运算符 Arithmetic operator
# 减法 # 加法 print(10 + 20) print('abc' + 'def') print([1, 2, 3] + [4, 5, 6]) Output: 30 abcdef [1, 2 ...
- linux下一些重要命令的了解
linux下一些比较重要的命令: du命令: 查看使用空间: 格式: du [选项][文件] 参数: -a 显示目录中个别文件的大小. -b 显示目录或文件大小时,以byte为单位. -c 除了 ...
- qsort函数排序各种类型的数据。
qsort函数是库函数中的一员,我们先来看看官方文档是怎么写的: 其中qsort的参数void* base是传入一个数组,size_t num 为数组整体大小,size_t size 为单个元素的大小 ...
- Python变量以及类型
变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...
- mysql中的锁
MYSQL不同的存储引擎支持不同的锁的机制 MyISAM 支持表锁,InnoDB支持表锁和行锁 表锁,行锁比较 表锁:开销小,加锁快:不会出现死锁:锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销 ...
- 【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
1.最大字段和问题 求一个序列最大连续子序列之和. 例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9. ①枚举法 int MaxSum(int n,int *a){ int ...
- DokuWiki 插件使用
本身DokuWiki提供了一些公共,但是不是很强大,所以可以安装一些插件. 安装方法可以参考:https://www.dokuwiki.org/extensions 下面列举出我觉得好用的一些插件: ...