设计良好的FLASH项目架构1-单例模式

2008-04-02 10:44:48来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  单例模式(Singleton)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用

  为什么要在FLASH中使用单例模式?

  首先我们明白,"单例"-即在软件运行时只提供一个实例,大家知道在面向对象编程中,实例化一个对象就意味着需要在内存中开辟一单元供这个对象的实例使用.而经常的,我们编写的一个类或函数需要在系统的很多地方被引用,不得已我们每次都需要去获取这个类的实例以供使用.以至于我们要不断的去new一个对象,如此一来,不但给系统增加负担,而且会给用户带来坏的使用体验-.

  就象我们制作一个工具,我们希望完成后,在以后随时随地我们都能够很方便地拿出这个工具来协助我们工作.而不是每次需要使用这个工具的时候都需要花时间花力气去重新制作这个工具.

  在FLASH中使用单例模式的目的即是如此.但是首先需要明确:

  1,这个工具是我们经常使用的.

  2,这个工具必须能够灵活使用,而不是就单针对着特定的某一件工作.正确的说,这个工具能够应付我同一类型的一系列工作,而不是异想天开的替我解决任何问题.

  3,不要让其他人使用这个工具,确保这个工具的专利属于我.

  在FLASH中什么情况适合使用单例模式?

  在具备以下的需求时,我们能够考虑使用单例模式:需要一个通用的业务逻辑处理器来处理同一类型的工作任务,需要一个数据访问对象来处理一系列的外部数据交互工作,前提是使用一致的数据访问手段.

  由于FLASH是基于客户端的软件,客户端基本上就是个人在使用,所以我们能够忽略通常在软件设计中需要考虑的线程并发问题(在B/S,C/S架构的系统中,通常这些任务由服务器来做).而且,虽然FLASH本身是多线程的,但是他并没有允许我们编程控制线程.

  因此,我们在FLASH中使用单例模式的好处就是:节约系统开销,增大代码重用性.其实最大的好处就仅是节约系统开销而已.至于代码重用我们能够基于自身对软件设计的经验使用各种方式做到.

  一个基本的单例模式:

  
classSingletonClass{

  privatestaticvarsingletonClass:SingletonClass=null;

  privatefunctionSingletonClass{}

  publicstaticfunctiongetInstance():SingletonClass{

  if(singletonClass==null){

  SingletonClass.singletonClass=newsingletonClass();

  }

  returnsingletonClass;

  }

  }


  在第一行代码.我们申明了一个静态(static)的变量,他的类型为SingletonClass类本身.既然申明的变量为static,那么在程式运行期间这个变量将会长驻在内存中而不会自动销毁

  第二行代码,我们写了一个空的构造函数,而且他是私有的(private),这意味着这个类不能够在外部被实例化,这也正是我们的目的.(我们专利的工具将不会被外人模仿使用)

  在 getInstance方法中,我们通过判断singletonClass的值是否为null来取决是否需要实例化singletonClass.第一次将singletonClass实例化以后,之后将无需再实例化singletonClass.最后,这个方法将会返回一个SingletonClass实例的引用-singletonClass

  看到这里,相信大家都已明白单例模式的构成原理

  下面我们来做一个应用单例模式的DEMO

  我们将做一个用户信息查询的模块,应用单例模式主要的目的是确保在用户活动过程中,相关用户信息的外部数据调用工作只做一次.

  考虑到设计良好的应用结构,我们将会稍微在单例模式的原则上做一些改变.我们将这一应用分为:用户模型,业务逻辑控制器,FLASH视图三部分,数据访问对象将会由FLASH内置的XML对象来充当(其实这种架构是参考常用的B/S软件结构来设计,从实际B/S系统结构的原则上讲,整个FLASH应用程式都只将作为表示层).

  代表用户实体的类

  
MemberEntry.as

  classcom.hizon.domain.MemberEntry{

  privatevarid:Number;

  privatevaremail:String;

  publicfunctiongetId():Number{

  returnid;

  }

  publicfunctionsetId(id:Number):Void{

  this.id=id;

  }

  publicfunctiongetEmail():String{

  returnemail;

  }

  publicfunctionsetEmail(email:String):Void{

  this.email=email;

  }

  }

  member.xml

  xmlversion="1.0"encoding="gbk"?>

  <root>

  <id>1id>

  <email>bhlove@gmail.comemail>

  root>


  负责数据访问的类

  
MemberDao.as

  importcom.hizon.domain.MemberEntry;

  classcom.hizon.dao.MemberDao{

  privatestaticvarmemberEntry:MemberEntry=null;

  privatefunctionMemberDao(){}

  publicstaticfunctioninitMemberEntry(memberId:Number,event:Function):Void{

  if(MemberDao.memberEntry==null){

  varmemberProfileDoc:XML=memberProfileDoc=newXML();

  memberProfileDoc.ignoreWhite=true;

  memberProfileDoc.load("xml/member.xml");

  memberProfileDoc.onLoad=function(success){

  MemberDao.memberEntry=newMemberEntry();

  MemberDao.memberEntry.setId(memberProfileDoc.firstChild.childNodes[0].firstChild.nodeValue);

  MemberDao.memberEntry.setEmail(memberProfileDoc.firstChild.childNodes[1].firstChild.nodeValue);

  event.call(MemberDao,MemberDao.memberEntry);

  return;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: FlashMX实战精选:定义弹出窗口

下一篇: 研发类似微软中国导航条的控件