1. 程式人生 > >設計模式-簡單工廠(Demo)

設計模式-簡單工廠(Demo)

簡介

         工廠都是建立型模式、用來NEW類的、本文章用一個故事講述了簡單工廠模式

故事

在遙遠的未來、chenchen我生活條件不錯、但是每天都要做飯、chenchen很懶、只想吃、不想幹、所以就請了個女僕給chenchen做飯吃、女僕很牛、chenchen只要說、我要吃牛排、不一會、牛排就做好了放在桌子上、我又說還要紅酒、女僕開好紅酒、倒好放在桌子上、美滋滋的哈!小肉吃著、小酒喝著、美女陪著此等逍遙快活!

是什麼?

代替客戶端NEW類、客戶端與多個類解耦

為什麼要用?

上述故事、因為我做很多飯、要知道很多飯怎麼做、我很懶、不想做、不想那麼累、所以我找了一個漂亮的女僕給我做飯、女僕就是工廠、代替我去做飯、也就是代替我去NEW類、這樣讓我與飯菜解耦、我無須知道怎麼做飯、只要告訴女僕我要吃什麼就行啦!

UML圖(女僕是工廠累)

實現效果


程式碼

 <span style="font-size:18px;">   Public Class Maid '女僕類
        Function MakeFood(eat As String) As Food  '根據chenchen傳入要吃的食物返回做出的飯(NEW出的類)

            Dim food As Food '生命食物

            Select Case eat '選擇要做的食物(new的類)
                Case "牛排"
                    food = New Beef 'new了一個牛排類
                Case "紅酒"
                    food = New RedWine
            End Select
            Return food '返回食物
        End Function
    End Class

    Public MustInherit Class Food '抽象食物類

        Overridable Function Edible() As String '被食用的方法

        End Function
    End Class
    Public Class Beef : Inherits Food '牛排類

        Overrides Function Edible() As String
            Dim str As String
            str = "牛排:我被吃掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class
    Public Class RedWine : Inherits Food '紅酒類

        Overrides Function Edible() As String
            Dim str As String
            str = "紅酒:我被喝掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class
 
    '單機按鈕
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim nvpu As New Maid '例項化女僕
        Dim Food As String '申明食物

        Food = ComboBox1.Text '要吃的食物給Food變數

        Label1.Text = nvpu.MakeFood(Food).Edible() '(女僕.做飯(牛排).吃掉)
        '就是呼叫女僕工廠例項話出的紅酒類、使用它的吃方法
    End Sub</span>


        擴充套件

               上面故事說到如果我再新增一個需求、義大利麵怎麼辦???

               1 新增義大利麵類

<span style="font-size:18px;">    Public Class Noodles : Inherits Food '義大利麵類
        Overrides Function Edible() As String
            Dim str As String
            str = "義大利麵:我被我吃掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class</span>


               2 更改工廠

    Public Class Maid '女僕類
        Function MakeFood(eat As String) As Food  '根據chenchen傳入要吃的食物返回做出的飯(NEW出的類)

            Dim food As Food '生命食物

            Select Case eat '選擇要做的食物(new的類)
                Case "牛排"
                    food = New Beef 'new了一個牛排類
                Case "紅酒"
                    food = New RedWine
                Case "義大利麵"
                    food = New RedWine
            End Select
            Return food '返回食物
        End Function
    End Class

 3效果(這裡忘了點吃按鈕了、所以沒改過來、會盡快改正)


優點

               將客戶端與多個類解耦、只要知道工廠類和需求就能NEW類、解耦的類更改不會影響客戶端、形象點說類A、B、C呼叫類1、2、3、每個類都呼叫1、2、3這三個類如果1、2、3的類有更改、比如名字、叫4、5、6、了,那A、B、C這三個類每個關於123這三個類的都要改、如果中間加個工廠、只要改工廠就好啦。

缺點

                違背開放封閉原則、每次新增一個類都要改次工廠、其實簡單工廠嚴格的來說不是設計模式。

在哪用?

                多個類要呼叫多個類、多對多、中間加個工廠如圖

-----修改前


-----修改後


         也不知道說啥了…………寫個部落格花了2小時………………感覺沒啥可說的 = =

———————————寫了2個小時…………———————————

———————chenchen————————