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