欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

(第Ⅱ部分 創(chuàng)建型模式篇) 第6章 創(chuàng)建型模式專題

系統(tǒng) 1641 0
——.NET設(shè)計模式系列之七
Terrylee 2006 1
概述
創(chuàng)建型模式,就是用來創(chuàng)建對象的模式,抽象了實例化的過程。它幫助一個系統(tǒng)獨立于如何創(chuàng)建、組合和表示它的那些對象。本文對五種常用創(chuàng)建型模式進行了比較,通過一個游戲開發(fā)場景的例子來說該如何使用創(chuàng)建型模式。
為什么需要創(chuàng)建型模式
所有的創(chuàng)建型模式都有兩個永恒的主旋律:第一,它們都將系統(tǒng)使用哪些具體類的信息封裝起來;第二,它們隱藏了這些類的實例是如何被創(chuàng)建和組織的。外界對于這些對象只知道它們共同的接口,而不清楚其具體的實現(xiàn)細節(jié)。正因如此,創(chuàng)建型模式在創(chuàng)建什么( what ),由誰( who )來創(chuàng)建,以及何時( when )創(chuàng)建這些方面,都為軟件設(shè)計者提供了盡可能大的靈活性。
假定在一個游戲開發(fā)場景中,會用到一個現(xiàn)代風格房屋的對象,按照我們的一般想法,既然需要對象就創(chuàng)建一個:
ModernRoom room = new ModernRoom();
好了,現(xiàn)在現(xiàn)代風格房屋的對象已經(jīng)有了,如果這時房屋的風格變化了,需要的是古典風格的房屋,修改一下:
Classical Room room = new Classical Room();
試想一下,在我們的程序中有多少處地方用到了這樣的創(chuàng)建邏輯,而這里僅僅是房屋的風格變化了,就需要修改程序中所有的這樣的語句。現(xiàn)在我們封裝對象創(chuàng)建的邏輯,把對象的創(chuàng)建放在一個工廠方法中:
ModernFactory factory = new ModernFactory();
ModernRoom room = factory . Create();
當房屋的風格變化時,只需要修改
Classical Factory factory = new Classical Factory();
Classical Room room = factory . Create();
而其它的用到 room 的地方仍然不變。這就是為什么需要創(chuàng)建型模式了。創(chuàng)建者模式作用可以概括為如下兩點:
1 .封裝創(chuàng)建邏輯,絕不僅僅是 new 一個對象那么簡單。
2 .封裝創(chuàng)建邏輯變化,客戶代碼盡量不修改,或盡量少修改。
常見的五種創(chuàng)建型模式
單件模式 Singleton Pattern )解決的是實體對象的個數(shù)問題,其他的都是解決 new 所帶來的耦合關(guān)系問題。
工廠方法模式 Factory Pattern )在工廠方法中,工廠類成為了抽象類,其實際的創(chuàng)建工作將由其具體子類來完成。工廠方法的用意是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中去,強調(diào)的是“單個對象”的變化。
抽象工廠模式 Abstract Factory )抽象工廠是所有工廠模式中最為抽象和最具有一般性的一種形態(tài)。抽象工廠可以向客戶提供一個接口,使得客戶可以在不必指定產(chǎn)品的具體類型的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象,強調(diào)的是“系列對象”的變化。
生成器模式 Builder Pattern )把構(gòu)造對象實例的邏輯移到了類的外部,在這個類的外部定義了這個類的構(gòu)造邏輯。他把一個復(fù)雜對象的構(gòu)造過程從對象的表示中分離出來。其直接效果是將一個復(fù)雜的對象簡化為一個比較簡單的目標對象。他強調(diào)的是產(chǎn)品的構(gòu)造過程。
原型模式 Prototype Pattern )和工廠模式一樣,同樣對客戶隱藏了對象創(chuàng)建工作,但是,與通過對一個類進行實例化來構(gòu)造新對象不同的是,原型模式是通過拷貝一個現(xiàn)有對象生成新對象的。
如何選擇使用創(chuàng)建型模式
繼續(xù)考慮上面提到的游戲開發(fā)場景,假定在這個游戲場景中我們使用到的有墻( Wall ),屋子( Room ),門( Door )幾個部件。在這個過程中,同樣是對象的創(chuàng)建問題,但是會根據(jù)所要解決的問題不同而使用不同的創(chuàng)建型模式。
如果在游戲中,一個屋子只允許有一個門存在,那么這就是一個使用 Signleton 模式的例子,確保只有一個 Door 類的實例被創(chuàng)建。解決的是對象創(chuàng)建個數(shù)的問題。
示例代碼:
using System;
public sealed class SigletonDoor
{
static readonly SigletonDoor instance = new SigletonDoor();
static SigletonDoor()
{
}
public static SigletonDoor Instance
{
get
{
return instance;
}
}
}
在游戲中需要創(chuàng)建墻,屋子的實例時,為了避免直接對構(gòu)造器的調(diào)用而實例化類,這時就是工廠方法模式了,每一個部件都有它自己的工廠類。解決的是“單個對象”的需求變化問題。
示例代碼:
using System;
public abstract class Wall
{
public abstract void Display();
}
public class ModernWall:Wall
{
public override void Display()
{
Console . WriteLine( "ModernWall Builded" );
}
}
public abstract class WallFactory
{
public abstract Wall Create();
}
public class ModernFactory:WallFactory
{
public override Wall Create()
{
return new ModernWall();;
}
}
在游戲場景中,不可能只有一種墻或屋子,有可能有現(xiàn)代風格( Modern ),古典風格( Classical )等多系列風格的部件。這時就是一系列對象的創(chuàng)建問題了,是一個抽象工廠的例子。解決的是“系列對象”的需求變化問題。
示例代碼:
using System;
public abstract class Wall
{
public abstract void Display();
}
public class ModernWall:Wall
{
public override void Display()
{
Console . WriteLine( "ModernWall Builded" );
}
}
public class ClassicalWall:Wall
{
public override void Display()
{
Console . WriteLine( "ClassicalWall Builded" );
}
}
public abstract class Room
{
public abstract void Display();
}
public class ModernRoom:Room
{
public override void Display()
{
Console . WriteLine( "ModernRoom Builded" );
}
}
public class ClassicalRoom:Room
{
public override void Display()
{
Console . WriteLine( "ClassicalRoom Builded" );
}
}
public abstract class AbstractFactory
{
public abstract Wall CreateWall();
public abstract Room CreateRoom();
}
public class ModernFactory:AbstractFactory
{
public override Wall CreateWall()
{
return new ModernWall();
}
public override Room CreateRoom()
{
return new ModernRoom();
}
}
public class ClassicalFactory:AbstractFactory
{
public override Wall CreateWall()
{
return new ClassicalWall();
}
public override Room CreateRoom()
{
return new ClassicalRoom();
}
}
如果在游戲場景中,構(gòu)成某一個場景的算法比較穩(wěn)定,例如:這個場景就是用四堵墻,一個屋子,一扇門來構(gòu)成的,但具體是用什么風格的墻、屋子和門則是不停的變化的,這就是一個生成器模式的例子。解決的是“對象部分”的需求變化問題。
示例代碼:
using System;
using System . Collections;
public class Director
{
public void Construct( Builder builder )
{
builder . BuildWall();
builder . BuildRoom();
builder . BuildDoor();
}
}
public abstract class Builder
{
public abstract void BuildWall();
public abstract void BuildRoom();
public abstract void BuildDoor();
public abstract GameScene GetResult();
}
public class GameBuilder : Builder
{
private GameScene g;
public override void BuildWall()
{
g = new GameScene();
g . Add( "Wall" );
}
public override void BuildRoom()
{
g . Add( "Room" );
}
public override void BuildDoor()
{
g . Add( "Door" );
}
public override GameScene GetResult()
{
return g;
}
}
public class GameScene
{
ArrayList parts = new ArrayList();
public void Add( string part )
{
parts . Add( part );
}
public void Display()
{
Console . WriteLine( " GameScene Parts :" );
foreach ( string part in parts )
Console . WriteLine( part );
}
}
如果在游戲中,需要大量的古典風格或現(xiàn)代風格的墻或屋子,這時可以通過拷貝一個已有的原型對象來生成新對象,就是一個原型模式的例子了。通過克隆來解決“易變對象”的創(chuàng)建問題。
示例代碼:
using System;
public abstract class RoomPrototype
{
public abstract RoomPrototype Clone();
}
public class ModernPrototype:RoomPrototype
{
public override RoomPrototype Clone()
{
return (RoomPrototype) this . MemberwiseClone();
}
}
public class ClassicalPrototype:RoomPrototype
{
public override RoomPrototype Clone()
{
return (RoomPrototype) this . MemberwiseClone();
}
}
究竟選用哪一種模式最好取決于很多的因素。使用 Abstract Factory Prototype Pattern Builder Pattern 的設(shè)計比使用 Factory Method 的設(shè)計更加靈活,但是也更加復(fù)雜,尤其 Abstract Factory 需要龐大的工廠類來支持。通常,設(shè)計以使用 Factory Method 開始,并且當設(shè)計者發(fā)現(xiàn)需要更大的靈活性時,設(shè)計便會向其他設(shè)計模式演化,當你在多個設(shè)計模式之間進行權(quán)衡的時候,了解多個設(shè)計模式可以給你提供更多的選擇余地。
總結(jié)
使用創(chuàng)建者模式是為了提高系統(tǒng)的可維護性和可擴展性,提高應(yīng)對需求變化的能力!

參考文獻:
《設(shè)計模式中文版》
《DesignPatternsExplained》
idior 的《 你了解創(chuàng)建者模式了嗎? --- 創(chuàng)建者模式詳解
MSDN WebCast: http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx

(第Ⅱ部分 創(chuàng)建型模式篇) 第6章 創(chuàng)建型模式專題總結(jié)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩亚洲在线 | 久久国产日韩 | 青青草视频破解版 | 成人精品一区二区三区校园激情 | www.最色| 国产后式a一视频 | 色综合天天综合高清网国产 | 亚洲黄网站wwwwww | 国产精品久久久久秋霞影视 | 国产一起色一起爱 | 亚洲精品视频在线 | 一区二区日韩精品 | www.日韩| 国产gav成人免费播放视频 | 五月丁香啪啪. | 亚洲精品国精品久久99热 | 中文字幕 在线观看 | 欧美日本在线播放 | 天天色天天操天天射 | 国产精品成人国产乱一区 | 毛片在线免费 | 日本精品久久久久久久 | 成人精品视频在线观看 | 成人国产激情福利久久精品 | 免费av一区二区三区 | 污污的网站免费在线观看 | 99热这里有免费国内精品 | A片人人澡C片人人大片 | 日韩喷水 | 亚洲精品久久婷婷丁香51 | 亚洲伊人成综合网 | 亚洲一区二区免费视频 | 色综合欧美 | 青青青国产观看免费视频 | 一区二区三区四区在线播放 | 成人精品视频 | 成人精品国产 | 99久久人妻无码精品系列性欧美 | 国产精品福利视频免费观看 | 国内精品美女久久久久 | 色综合激情 |