一個工廠可以生產很多的產品,各種各樣五花八門的產品。這些產品是通過工廠生產出來的,一個工廠可以生產這些產品。這樣我們可以聯想到自己所寫的代碼。原廠模式解決了建立執行個體化的過程。典型的例子就是計算機的問題。面試人員同樣很喜歡把這樣的題目考察應聘者。看是否有一種熟悉的物件導向思維,把代碼封裝,實現代碼的重用性,繼承基類。擴充自己所要實現的功能。
物件導向的三大特性:封裝性,繼承,多態
像as3.0那樣,我們可以實現一些簡單的做法,例如我要計算面積這樣的方法作為基類。然後我們用繼續的方法繼承基類原本的方法,但是我們要計算三角形面積,或者正方形面積,這些都是很簡單,繼承了基類的方法,並不是我們所要的結果,這時候我們需要同過override 聲明來重寫方法,做到繼承所要的方法。
//基類
package {
public class Operation {
private var StrNumA:Number=0;
private var StrNumB:Number=0;
public function set SetNumA(Num:Number):void {
StrNumA=Num;
}
public function set SetNumB(Num:Number):void {
StrNumB=Num;
}
public function get GetNumA():Number {
return StrNumA;
}
public function get GetNumB():Number {
return StrNumB;
}
public function Result():Number {
var Myresult:Number=0;
return Myresult;
}
}
}//運算
//加法繼承基類
package {
public class Add extends Operation {
private var NumA:Number;
private var NumB:Number;
override public function set SetNumA(Num:Number):void {
NumA=Num;
}
override public function set SetNumB(Num:Number):void {
NumB=Num;
}
override public function get GetNumA():Number {
return NumA;
}
override public function get GetNumB():Number {
return NumB;
}
override public function Result():Number {
var Myresult:Number=0;
Myresult=NumA+NumB;
return Myresult;
}
}
}
//減法繼承基類
package{
public class Sub extends Operation{
private var NumA:Number;
private var NumB:Number;
override public function set SetNumA(Num:Number):void {
NumA=Num;
}
override public function set SetNumB(Num:Number):void {
NumB=Num;
}
override public function get GetNumA():Number {
return NumA;
}
override public function get GetNumB():Number {
return NumB;
}
override public function Result():Number{
var Myresult;
Myresult=NumA-NumB;
return Myresult;
}
}
}
//繼承基類
package{
public class Mul extends Operation{
private var NumA:Number;
private var NumB:Number;
override public function set SetNumA(Num:Number):void {
NumA=Num;
}
override public function set SetNumB(Num:Number):void {
NumB=Num;
}
override public function get GetNumA():Number {
return NumA;
}
override public function get GetNumB():Number {
return NumB;
}
override public function Result():Number{
var Myresult;
Myresult=NumA*NumB;
return Myresult;
}
}
}
//繼承基類
package{
public class Div extends Operation{
private var NumA:Number;
private var NumB:Number;
override public function set SetNumA(Num:Number):void {
NumA=Num;
}
override public function set SetNumB(Num:Number):void {
NumB=Num;
}
override public function get GetNumA():Number {
return NumA;
}
override public function get GetNumB():Number {
return NumB;
}
override public function Result():Number{
var Myresult:Number=0;
if(NumB==0)trace("cuowo");//這裡還要處理,以防除數為o
Myresult=NumA/NumB;
return Myresult;
}
}
}
//工廠
package {
public class OperationFactory {
public static function CreateOperate(str:String):Operation {
var op:Operation;
switch (str) {
case "+" :
op=new Add();
trace("+");
break;
case "-" :
op=new Sub();
break;
case "*" :
op=new Mul();
break;
case "/" :
op=new Div();
break;
}
return op;
}
}
}
還有一個用戶端:這裡還要做其他處理才可以完成我們的效果
package {
import flash.display.MovieClip;
import flash.display.*;
import flash.events.*;
import flash.text.*;
public class Main extends MovieClip {
var oper:Operation;
public function Main() {
oper=OperationFactory.CreateOperate("-");
oper.SetNumA=2;
oper.SetNumB=3;
trace(oper.GetNumB);
var Myresult2:Number=oper.Result();
trace(Myresult2);
}
}