欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
博客園 - 探索設計模式(七):創(chuàng )建型模式專(zhuān)題總結(Creational Pattern)

創(chuàng )建型模式專(zhuān)題總結(Creational Pattern

——探索設計模式系列之七

Terrylee,20061

概述

創(chuàng )建型模式,就是用來(lái)創(chuàng )建對象的模式,抽象了實(shí)例化的過(guò)程。它幫助一個(gè)系統獨立于如何創(chuàng )建、組合和表示它的那些對象。本文對五種常用創(chuàng )建型模式進(jìn)行了比較,通過(guò)一個(gè)游戲開(kāi)發(fā)場(chǎng)景的例子來(lái)說(shuō)該如何使用創(chuàng )建型模式。

為什么需要創(chuàng )建型模式

所有的創(chuàng )建型模式都有兩個(gè)永恒的主旋律:第一,它們都將系統使用哪些具體類(lèi)的信息封裝起來(lái);第二,它們隱藏了這些類(lèi)的實(shí)例是如何被創(chuàng )建和組織的。外界對于這些對象只知道它們共同的接口,而不清楚其具體的實(shí)現細節。正因如此,創(chuàng )建型模式在創(chuàng )建什么(what),由誰(shuí)(who)來(lái)創(chuàng )建,以及何時(shí)(when)創(chuàng )建這些方面,都為軟件設計者提供了盡可能大的靈活性。

假定在一個(gè)游戲開(kāi)發(fā)場(chǎng)景中,會(huì )用到一個(gè)現代風(fēng)格房屋的對象,按照我們的一般想法,既然需要對象就創(chuàng )建一個(gè):

ModernRoom room = new ModernRoom();

好了,現在現代風(fēng)格房屋的對象已經(jīng)有了,如果這時(shí)房屋的風(fēng)格變化了,需要的是古典風(fēng)格的房屋,修改一下:

ClassicalRoom room = new ClassicalRoom();

試想一下,在我們的程序中有多少處地方用到了這樣的創(chuàng )建邏輯,而這里僅僅是房屋的風(fēng)格變化了,就需要修改程序中所有的這樣的語(yǔ)句?,F在我們封裝對象創(chuàng )建的邏輯,把對象的創(chuàng )建放在一個(gè)工廠(chǎng)方法中:

ModernFactory factory = new ModernFactory();

ModernRoom room = factory.Create();

當房屋的風(fēng)格變化時(shí),只需要修改

ClassicalFactory factory = new ClassicalFactory();

ClassicalRoom room = factory.Create();

而其它的用到room的地方仍然不變。這就是為什么需要創(chuàng )建型模式了。創(chuàng )建者模式作用可以概括為如下兩點(diǎn):

1.封裝創(chuàng )建邏輯,絕不僅僅是new一個(gè)對象那么簡(jiǎn)單。

2.封裝創(chuàng )建邏輯變化,客戶(hù)代碼盡量不修改,或盡量少修改。

常見(jiàn)的五種創(chuàng )建型模式

單件模式Singleton Pattern)解決的是實(shí)體對象的個(gè)數問(wèn)題,其他的都是解決new所帶來(lái)的耦合關(guān)系問(wèn)題。

工廠(chǎng)方法模式Factory Pattern)在工廠(chǎng)方法中,工廠(chǎng)類(lèi)成為了抽象類(lèi),其實(shí)際的創(chuàng )建工作將由其具體子類(lèi)來(lái)完成。工廠(chǎng)方法的用意是定義一個(gè)創(chuàng )建產(chǎn)品對象的工廠(chǎng)接口,將實(shí)際創(chuàng )建工作推遲到子類(lèi)中去,強調的是“單個(gè)對象”的變化。

抽象工廠(chǎng)模式Abstract Factory)抽象工廠(chǎng)是所有工廠(chǎng)模式中最為抽象和最具有一般性的一種形態(tài)。抽象工廠(chǎng)可以向客戶(hù)提供一個(gè)接口,使得客戶(hù)可以在不必指定產(chǎn)品的具體類(lèi)型的情況下,創(chuàng )建多個(gè)產(chǎn)品族中的產(chǎn)品對象,強調的是“系列對象”的變化。

生成器模式Builder Pattern)把構造對象實(shí)例的邏輯移到了類(lèi)的外部,在這個(gè)類(lèi)的外部定義了這個(gè)類(lèi)的構造邏輯。他把一個(gè)復雜對象的構造過(guò)程從對象的表示中分離出來(lái)。其直接效果是將一個(gè)復雜的對象簡(jiǎn)化為一個(gè)比較簡(jiǎn)單的目標對象。他強調的是產(chǎn)品的構造過(guò)程。

原型模式Prototype Pattern)和工廠(chǎng)模式一樣,同樣對客戶(hù)隱藏了對象創(chuàng )建工作,但是,與通過(guò)對一個(gè)類(lèi)進(jìn)行實(shí)例化來(lái)構造新對象不同的是,原型模式是通過(guò)拷貝一個(gè)現有對象生成新對象的。

如何選擇使用創(chuàng )建型模式

繼續考慮上面提到的游戲開(kāi)發(fā)場(chǎng)景,假定在這個(gè)游戲場(chǎng)景中我們使用到的有墻(Wall),屋子(Room),門(mén)(Door)幾個(gè)部件。在這個(gè)過(guò)程中,同樣是對象的創(chuàng )建問(wèn)題,但是會(huì )根據所要解決的問(wèn)題不同而使用不同的創(chuàng )建型模式。

如果在游戲中,一個(gè)屋子只允許有一個(gè)門(mén)存在,那么這就是一個(gè)使用Signleton模式的例子,確保只有一個(gè)Door類(lèi)的實(shí)例被創(chuàng )建。解決的是對象創(chuàng )建個(gè)數的問(wèn)題。

示例代碼:

using System;

public sealed class SigletonDoor

{

    static readonly SigletonDoor instance=new SigletonDoor();

    static SigletonDoor()

    {

    }

    public static SigletonDoor Instance

    {

        get

        {

            return instance;

        }

    }

}

在游戲中需要創(chuàng )建墻,屋子的實(shí)例時(shí),為了避免直接對構造器的調用而實(shí)例化類(lèi),這時(shí)就是工廠(chǎng)方法模式了,每一個(gè)部件都有它自己的工廠(chǎng)類(lèi)。解決的是“單個(gè)對象”的需求變化問(wèn)題。

示例代碼:

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();;

    }

}

在游戲場(chǎng)景中,不可能只有一種墻或屋子,有可能有現代風(fēng)格(Modern),古典風(fēng)格(Classical)等多系列風(fēng)格的部件。這時(shí)就是一系列對象的創(chuàng )建問(wèn)題了,是一個(gè)抽象工廠(chǎng)的例子。解決的是“系列對象”的需求變化問(wèn)題。

示例代碼:

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();

    }

}

如果在游戲場(chǎng)景中,構成某一個(gè)場(chǎng)景的算法比較穩定,例如:這個(gè)場(chǎng)景就是用四堵墻,一個(gè)屋子,一扇門(mén)來(lái)構成的,但具體是用什么風(fēng)格的墻、屋子和門(mén)則是不停的變化的,這就是一個(gè)生成器模式的例子。解決的是“對象部分”的需求變化問(wèn)題。

示例代碼:

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 );

    }

}

如果在游戲中,需要大量的古典風(fēng)格或現代風(fēng)格的墻或屋子,這時(shí)可以通過(guò)拷貝一個(gè)已有的原型對象來(lái)生成新對象,就是一個(gè)原型模式的例子了。通過(guò)克隆來(lái)解決“易變對象”的創(chuàng )建問(wèn)題。

示例代碼:

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 PatternBuilder Pattern的設計比使用Factory Method的設計更加靈活,但是也更加復雜,尤其Abstract Factory需要龐大的工廠(chǎng)類(lèi)來(lái)支持。通常,設計以使用Factory Method開(kāi)始,并且當設計者發(fā)現需要更大的靈活性時(shí),設計便會(huì )向其他設計模式演化,當你在多個(gè)設計模式之間進(jìn)行權衡的時(shí)候,了解多個(gè)設計模式可以給你提供更多的選擇余地。

總結

使用創(chuàng )建者模式是為了提高系統的可維護性和可擴展性,提高應對需求變化的能力!

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
設計模式(1)裝飾模式總結
訪(fǎng)問(wèn)者模式(Visitor Pattern)
Visitor模式的可行與不可愛(ài)
C#設計模式(18)——中介者模式(Mediator Pattern)
C#設計模式之總結篇
Head First 設計模式 C#實(shí)現_headfirstc#
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久