
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
今天我们就来谈谈设计模式里的创建型中的简单工厂,在面向对象的编程方式中,创建对象实例化对象是经常需要做的事情,创建型模式(Creational Patten) 也就是用来创建对象的设计模式,对类的实例化过程进行抽象,使软件模块做到与对象的创建和组织无关.下面我就来介绍创建模式里的简单工厂模式(Simple Factory Pattern) .
啥也不说先上Uml图:
所谓简单工厂其实是由一个工厂类根据传入的参数,来动态决定应该创建出哪一个产品的实例.简单工厂从严格意义上来讲不属于GoF(GoF的解释请参看上一篇:as3设计模式教程之设计模式基本概念). 简单工厂是作为我们学习工厂模式或抽象工厂模式的一个引导.从我用PD画的图可以看出有参与者:

工厂(Creator)角色:是简单工厂模式的核心,它负责实现创造所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象;
抽象的产品(Product):是简单工厂模式说创建的所有对象的父类或者接口,它负责描述所有实例说共同的公共接口;
具体产品(Concrete Product):简单工厂的创建目标,所有创建的对象都是充当这个角色的某个具体的类的实例.
本来想画顺序图,但PD好像不能画,或者我不会用PD画.机器上没装Visio 所以下次再画吧.直接上AS3实例
这个一个简单的画画的程序,我只做了画矩形和圆形,用了简单工厂模式,不过做了一些改变和uml图不大一样,大家自己看吧!!由于空间不允许下载,所以需要源文件的朋友可以到留言板留下email ,我会给大家发源文件,或者代码又不明白的地方也可以到留言板留言,谢谢!!
下面我把代码贴出来:
package{import flash.display.MovieClip;import kblib.*;import flash.events.MouseEvent;import flash.display.DisplayObject;import flash.external.*;import flash.ui.ContextMenuItem;import flash.events.ContextMenuEvent;import flash.ui.ContextMenu;//doucment classpublic class KbDoucment extends MovieClip{private var brush:Figure; //抽象图像接口private var strType:String; //确定实例什么的一个类型字符串private var tmpeDot:KbDot; //用来描述点的类,这里记录起始点private var logo:MovieClip;private var arrFigure:Array//Doucment 的构造函数public function KbDoucment(){brush = null;tmpeDot = null;arrFigure = new Array();strType = "Rect";//初始是画矩形滴var myContextMenu:ContextMenu = new ContextMenu();myContextMenu.hideBuiltInItems();var item:ContextMenuItem=new ContextMenuItem("51as.com-专注于ActionScript");myContextMenu.customItems.push(item);item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,clickItem);this.contextMenu = myContextMenu;toolsbar.btnCircle.addEventListener(MouseEvent.CLICK,clickBtnCircle);toolsbar.btnRect.addEventListener(MouseEvent.CLICK,clickBtnRect);toolsbar.btnClear.addEventListener(MouseEvent.CLICK,clickBtnClear);toolsbar.logo.addEventListener(MouseEvent.CLICK,clickLogo);stage.addEventListener(MouseEvent.MOUSE_DOWN,mouse_Down);stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_Move);stage.addEventListener(MouseEvent.MOUSE_UP,mouse_Up);}private function clickItem(e:ContextMenuEvent):void{ExternalInterface.call("window.open","http://www.51as.com","_blank");}private function clickLogo(e:MouseEvent):void{ExternalInterface.call("window.open","http://www.51as.com","_blank");}private function
clickBtnCircle(e:MouseEvent):void
{
strType = "Circle";
}
private function clickBtnRect(e:MouseEvent):void
{
strType = "Rect";
}
private function clickBtnClear(e:MouseEvent):void
{
for(var i:int =0 ; i< arrFigure.length ;i++)
{
this.removeChild(arrFigure[i] as DisplayObject); //清除图像
}
arrFigure = new Array();
}
private function mouse_Down(e:MouseEvent):void
{
brush = simpleFactory.creatFigure(strType);//使用工厂类来构造具体产品
tmpeDot = new KbDot(e.localX,e.localY);
this.addChild(brush as DisplayObject);
this.swapChildren(toolsbar,brush as DisplayObject);
}
private function mouse_Up(e:MouseEvent):void
{
if(brush!=null || tmpeDot !=null)
{
var updot = new KbDot(e.localX,e.localY);
brush.draw(tmpeDot,updot);
tmpeDot =null;
arrFigure.push(brush);
brush = null;
}
}
private function mouse_Move(e:MouseEvent):void
{
if(brush!=null || tmpeDot !=null)
{
var updot = new KbDot(e.localX,e.localY);
brush.draw(tmpeDot,updot);
}
}
}
}
package kblib
{
//抽象产品
public interface Figure
{
function draw(downDot:KbDot,upDot:KbDot):void
}
}
package kblib
{
public class simpleFactory
{
public static function creatFigure(strType:String):Figure
{
var reFigure:Figure =null;
switch (strType)
{
case "Circle":
{
reFigure = new KbCircle();
break;
}
case "Rect":
{
reFigure = new KbRect();
break;
}
}
if(reFigure==null)
{
throw new Error("没有该图形的实例名称");
}
return reFigure;
}
}
}
package kblib
{
//用来表示点的类
public class KbDot
{
private var _x:Number;
private var _y:Number;
public function KbDot(mouseX:int,mouseY:int)
{
this._x = mouseX;
this._y= mouseY;
}
public function get X():Number
{
return this._x;
}
public function get Y():Number
{
return this._y;
}
public function dotFrom(otherDot:KbDot):Number
{
Math.sqrt((this._x-otherDot.X)*(this._x-otherDot.X)+(this._y-otherDot.Y)*(this._y-otherDot.Y));
}
}
}
package kblib
{
import flash.display.MovieClip;
//具体产品 矩形
public class KbRect extends MovieClip implements Figure
{
public function draw(downDot:KbDot, upDot:KbDot):void
{
this.graphics.clear();
this.graphics.beginFill(000000);
this.graphics.drawRect((downDot.X>upDot.X?upDot.X:downDot.X),(downDot.Y>upDot.Y?upDot.Y:downDot.Y),Math.abs(downDot.X-upDot.X),Math.abs(downDot.Y-upDot.Y));
this.graphics.endFill();
}
}
}
package kblib
{
import flash.display.MovieClip;
//具体产品 圆
public class KbCircle extends MovieClip implements Figure
{
public function draw(downDot:KbDot,upDot:KbDot):void
{
this.graphics.clear();
this.graphics.beginFill(000000);
this.graphics.drawCircle(downDot.X,downDot.Y,downDot.dotFrom(upDot));
this.graphics.endFill();
}
}
}