Individual Entry

【翻译】抽象工厂在as2.0中的运用

来自www.design-nation.net

原文在这里:http://www.design-nation.net/en/archives/000411.php

我毕竟是中学文化水平,有一些地方翻译的不正确,希望朋友们指出:)
抽象工厂模式实例:

抽象工厂(abstract factory)属于创建型模式。它提供一个接口来创建一系列相关联的对象,而不用具体指定它们的类...
来自www.design-nation.net

原文在这里:http://www.design-nation.net/en/archives/000411.php

抽象工厂模式实例:

抽象工厂(abstract factory)属于创建型模式。它提供一个接口来创建一系列相关联的对象,而不用具体指定它们的类。

我会尝试用真实生活中的例子来解释它。假设我正在装修我的房子,可是在我住的地方只有两家家具店——一家卖现代设计风格的家具,另一家卖古典风格的家具。假如我只想买一扇门和一个电视机(我可没有那么多钱),而且最终我在其中一家家具店买了这两样物品。所以,如果我想买一个电视机,我要做的仅仅是进入其中任何一家商店,要求他们给我一台电视机(当然,我会付钱给他们)。在把这台电视机正确的安装在家里之后,我可以做一些事情(比如打开或关闭电视机的开关,调高音量等等),而一个现代风格的电视机和一个古典的电视机都拥有这些功能,尽管它们在使用方面会多少有所不同。
那么我知道,我可以去任何一个商店(现代的或者古典的,这就取决于我了),但是我也可以把钱交给某个人,让他来替我买电视机,并且替我拿回家——而我仅仅需要说:“请帮我拿回来一个现代风格的电视机”,他明白我说什么,并且会去那个卖现代风格家具的商店里买回来一个电视机,这里面的他就是抽象工厂(abstract factory),我不必知道他是如何带回来那个电视机的,我只想要我的电视机。
在使用AS2.0实现他之前,我必须说一些很重要的事情——AS2.0并不支持抽象类的建立,所以我只能模拟抽象类,但是实际上ActionScript并不支持抽象类,所以虽然GoF这本书说抽象工厂中的工厂应该继承自一个抽象类,但是我的代码的实现仍然是基于接口(interface)的。
下面让我们回到代码上来,如果我自己去商店,或者让别人帮我拿回来,我们都需要告诉商店“我需要一个电视”,所以商店和买电视的人都有一个共同的接口(说的更明白一些,他们应该继承自同一个抽象类,但是actionscript并不支持抽象类,所以它们只是实现了相同的接口):
import net.designnation.patterns.AbstractFactory.*

interface net.designnation.patterns.AbstractFactory.IFactoryActions
{
public function getTV( ): ITVActions;

public function getDoor( ): IDoorActions;
}
这里只定义了两种行为(action):getTV和getDoor(分别对应着“我需要一个电视机”和“给我一扇门”)
下面是两个商店的代码:
//现代风格家具商店
import net.designnation.patterns.AbstractFactory.*

class net.designnation.patterns.AbstractFactory.ModernShop implements IFactoryActions
{
function ModernShop( )
{
trace( "I've picked a modern shop" );
}

public function getTV( ): ITVActions
{
return new BrandNewTV( );
}

public function getDoor( ): IDoorActions
{
return new ModernDoor( );
}
}
//古典风格家具商店
import net.designnation.patterns.AbstractFactory.*

class net.designnation.patterns.AbstractFactory.ClassicShop implements IFactoryActions
{
public function ClassicShop( )
{
trace( "I've picked a classic shop" );
}

public function getTV( ): ITVActions
{
return new OldTV( );
}

public function getDoor( ): IDoorActions
{
return new ClassicDoor( );
}
}
以上两个类(家具店)都实现了相同的接口:
IfactoryActions ( 换句话说, 它们实现了两种方法: getTV, and getDoor ).

让我们更进一步看看getTV方法:
public function getTV( ): ITVActions
{
return new OldTV( );
}

我们创建了OldTV类的实例,但是方法却返回了一个接口,这方便我们同意管理我们的电视机,我们无需关心从哪里买的电视机,我们只需要知道一些操作(打开开关或者其他),所以两家商店的电视机将实现同一个接口:
interface net.designnation.patterns.AbstractFactory.ITVActions
{
public function pumpUpTheVolume( );
public function shutUp( );
}
//现代风格的电视机
class net.designnation.patterns.AbstractFactory.BrandNewTV implements ITVActions
{
function BrandNewTV( )
{
trace( "I've received is my new 42 inches plasma TV" );
}

public function pumpUpTheVolume( )
{
trace( "sure, let me find the remote..." );
}

public function shutUp( )
{
trace( "By pressing down this key, the sound dies" );
}
}
//古典风格的电视机
import net.designnation.patterns.AbstractFactory.*

class net.designnation.patterns.AbstractFactory.OldTV implements ITVActions
{
function OldTV( )
{
trace( "I've bought an old TV" );
}

public function pumpUpTheVolume( )
{
trace( "My old tv has no remote, so I must wake up and pumpUpTheVolume myself" );
}

public function shutUp( )
{
trace( "My old tv has no remote, so........" );
}
}
我们也用相同的办法处理门,无论这个门是现代风格还是古典风格,它们都有一些相同的操作(比如开门或者关门),下面是它们实现的接口
interface net.designnation.patterns.AbstractFactory.IDoorActions
{
public function open( );
public function close( );
}
//现代风格的门
class net.designnation.patterns.AbstractFactory.ModernDoor implements IDoorActions
{
function ModernDoor( )
{
trace( "ModernDoor constructor" );
}

public function open( )
{
trace( "the modern door is opened" );
}

public function close( )
{
trace( "the modern door is closed" );
}
}
//古典风格的门
import net.designnation.patterns.AbstractFactory.*

class net.designnation.patterns.AbstractFactory.ClassicDoor implements IDoorActions
{
function ClassicDoor( )
{
trace( "ClassicDoor constructor" );
}

public function open( )
{
trace( "the classic door is opened " );
}

public function close( )
{
trace( "the classic door is closed" );
}
}
再次往回看,我们拥有两个商店,每一个商店都有门和电视机,古典风格家具店卖的是古典风格的门和电视机,而现代风格家具店卖的是现代风格的门和电视机。
import net.designnation.patterns.AbstractFactory.*

class net.designnation.patterns.AbstractFactory.AbstractFactory
{
public static var MODERN : Number = 1;
public static var CLASSIC : Number = 2;

public static function getFactory( shopType: Number ): IFactoryActions
{
if ( ( shopType & MODERN ) == MODERN )
{
return new ModernShop( );
}

if ( ( shopType & CLASSIC ) == CLASSIC )
{
return new ClassicShop( );
}
}
}
这个类实现了ModernShop和Classic Shop实现的共同接口,所以我们可以说
This class implements the same interface that both ModernShop and Classic shop implement. So, I will only have to say: “嗨,抽象工厂,给我拿来一个现代风格的电视机。”我已经可以忘记这个详细的过程了,在这个过程的最后,我将会得到一个电视机,而我不会知道它是如何跑到家里面的,在哪里生产的,在哪里卖的……但是如何实现呢?需要下面的代码:
import net.designnation.patterns.AbstractFactory.*

var factory: IFactoryActions = AbstractFactory.getFactory( AbstractFactory.MODERN );

var myTV: ITVActions = factory.getTV( );
myTV.pumpUpTheVolume( );

var myDoor: IDoorActions = factory.getDoor( );
myDoor.close( );

by Cesar Tardaguila Date: September 29, 2004 09:10 AM

感谢他们:)

2 comments:

我一点也看不懂啊:(
怎么办啊,我怎么这么苯啊!!!
by: Wsir (contact) - 20 Apr '05 - 16:12
不着急~那是去年的blog文章,今天整理了blog,拿出来充数
by: greentea (contact) - 20 Apr '05 - 16:42



:

:
:



Meta Information:

Title: 【翻译】抽象工厂在as2.0中的运用
Date posted: 20 Nov '05 - 10:15
Filed under: translation
Wordcount: 417 words
Good Karma: 158 (vote)
Bad Karma: 135 (vote)
Next entry:  【翻译】SWF结构规范第四章:显示列表(一)
Previous entry:  工程目录结构及命名规范(三)

Frontpage