首页 > 代码库 > 设计模式-简单工厂(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————————