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

設計模式-工廠方法(Demo)

工廠方法

          工廠方法跟簡單工廠一樣、都是建立型的設計模式、他解決了簡單工廠的違背開放封閉的缺點。

故事

          主人……人家做飯好累的、女僕抱著我大腿說著、自從上次把她買進家、沒做了幾次飯就喊累……看著她那出處可憐的眼神、罷了、再招幾個女僕吧、話說還沒給第一個女僕起名字、就叫‘遙’吧、後來又招了‘媛’和‘悅’、然後讓她們分別只做一道菜、遙做牛排、媛做紅酒、悅做義大利麵、這次每次我想吃牛排就直接跟遙說‘吃飯’,喝紅酒就跟媛說‘吃飯’而不用說吃什麼了、因為她們每個人只做一道菜、以後要再想吃別的、就再招個女僕、只做一道菜、也不影響現有的女僕、這樣她們也不會抱怨嘍、美女環繞、喝酒吃肉、神仙快活——

------UML圖

        如圖所示、原先的女僕工廠換成了女僕介面、然後有特定的女僕去做個個食物、這樣的好處就是、如果在加一個食物、只要再加一個女僕工廠、再加個食物類就行了、不違背開放封閉原則、不像簡單工廠還要修改工廠類。

程式碼

<span style="font-size:18px;">Public Class Form1
    '女僕介面
    Public Interface IMaid
        Function IMakeFood() As Food '做食物的方法
    End Interface
    '女僕遙
    Public Class YAO : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New Beef '返回牛排例項化的類
        End Function
    End Class
    '女僕媛
    Public Class yuan : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New RedWine '返回紅酒例項化的類
        End Function
    End Class
    '女僕悅
    Public Class yue : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New Noodles '返回義大利麵例項化的類
        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
    Public Class Noodles : 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 YAO As IMaid = New YAO '宣告女僕例項化遙

        Label1.Text = YAO.IMakeFood().Edible() '遙做牛排
        
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim yuan As IMaid = New yuan '宣告女僕例項化媛
        Label1.Text = yuan.IMakeFood().Edible() '媛做牛排

    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim yue As IMaid = New yue '宣告女僕例項化悅
        Label1.Text = yue.IMakeFood().Edible() '悅做牛排
    End Sub
End Class

</span>

實際效果


擴充套件

           再加一個女僕櫻類、加一個披薩食物類

<span style="font-size:18px;">    Public Class pizz : Inherits Food '披薩

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

    End Class

    '女僕櫻
    Public Class ying : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New pizz '返回披薩例項化的類
        End Function
    End Class
    ‘單機按鈕加一個
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim ying As IMaid = New ying '宣告女僕例項化櫻
        Label1.Text = ying.IMakeFood().Edible() '櫻做披薩
    End Sub
</span>

效果圖


好處、兩張圖帶

用設計模式之前的多對多關係、如果在加一個食物、你我他三個類都要做更改


        用設計模式之後的、只要知道工廠類就行了、與食物類解耦和、擴充套件的話就加一個食物類加一個工廠類、客戶端呼叫就行


—————————————————夠明顯了吧—————————————————

——————————工廠方法——————————

————chenchen————