工厂方法

工厂方法跟简单工厂一样、都是创建型的设计模式、他攻克了简单工厂的违背开放封闭的缺点。

故事

主人……人家做饭好累的、女仆抱着我大腿说着、自从上次把她买进家、没做了几次饭就喊累……看着她那出处可怜的眼神、罢了、再招几个女仆吧、话说还没给第一个女仆起名字、就叫‘遥’吧、后来又招了‘媛’和‘悦’、然后让她们分别仅仅做一道菜、遥做牛排、媛做红酒、悦做意大利面、这次每次我想吃牛排就直接跟遥说‘吃饭’,喝红酒就跟媛说‘吃饭’而不用说吃什么了、由于她们每一个人仅仅做一道菜、以后要再想吃别的、就再招个女仆、仅仅做一道菜、也不影响现有的女仆、这样她们也不会抱怨喽、美女围绕、喝酒吃肉、神仙快活——

------UML图

如图所看到的、原先的女仆工厂换成了女仆接口、然后有特定的女仆去做个个食物、这种优点就是、假设在加一个食物、仅仅要再加一个女仆工厂、再加个食物类即可了、不违背开放封闭原则、不像简单工厂还要改动工厂类。

代码

  1. <span style="font-size:18px;">Public Class Form1
  2. '女仆接口
  3. Public Interface IMaid
  4. Function IMakeFood() As Food '做食物的方法
  5. End Interface
  6. '女仆遥
  7. Public Class YAO : Implements IMaid
  8. Public Function IMakeFood() As Food Implements IMaid.IMakeFood
  9. Return New Beef '返回牛排实例化的类
  10. End Function
  11. End Class
  12. '女仆媛
  13. Public Class yuan : Implements IMaid
  14. Public Function IMakeFood() As Food Implements IMaid.IMakeFood
  15. Return New RedWine '返回红酒实例化的类
  16. End Function
  17. End Class
  18. '女仆悦
  19. Public Class yue : Implements IMaid
  20. Public Function IMakeFood() As Food Implements IMaid.IMakeFood
  21. Return New Noodles '返回意大利面实例化的类
  22. End Function
  23. End Class
  24.  
  25. Public MustInherit Class Food '抽象食物类
  26.  
  27. Overridable Function Edible() As String '被食用的方法
  28.  
  29. End Function
  30. End Class
  31. Public Class Beef : Inherits Food '牛排类
  32.  
  33. Overrides Function Edible() As String
  34. Dim str As String
  35. str = "牛排:我被吃掉~\(≧▽≦)/~啦啦啦"
  36. Return str
  37. End Function
  38.  
  39. End Class
  40. Public Class RedWine : Inherits Food '红酒类
  41.  
  42. Overrides Function Edible() As String
  43. Dim str As String
  44. str = "红酒:我被喝掉~\(≧▽≦)/~啦啦啦"
  45. Return str
  46. End Function
  47.  
  48. End Class
  49. Public Class Noodles : Inherits Food '红酒类
  50. Overrides Function Edible() As String
  51. Dim str As String
  52. str = "意大利面:我被我吃掉~\(≧▽≦)/~啦啦啦"
  53. Return str
  54. End Function
  55.  
  56. End Class
  57. '单机button
  58. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  59. Dim YAO As IMaid = New YAO '声明女仆实例化遥
  60.  
  61. Label1.Text = YAO.IMakeFood().Edible() '遥做牛排
  62.  
  63. End Sub
  64.  
  65. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  66. Dim yuan As IMaid = New yuan '声明女仆实例化媛
  67. Label1.Text = yuan.IMakeFood().Edible() '媛做牛排
  68.  
  69. End Sub
  70.  
  71. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  72. Dim yue As IMaid = New yue '声明女仆实例化悦
  73. Label1.Text = yue.IMakeFood().Edible() '悦做牛排
  74. End Sub
  75. End Class
  76.  
  77. </span>

实际效果

扩展

再加一个女仆樱类、加一个披萨食物类

  1. <span style="font-size:18px;"> Public Class pizz : Inherits Food '披萨
  2.  
  3. Overrides Function Edible() As String
  4. Dim str As String
  5. str = "披萨:我被吃掉~\(≧▽≦)/~啦啦啦"
  6. Return str
  7. End Function
  8.  
  9. End Class
  10.  
  11. '女仆樱
  12. Public Class ying : Implements IMaid
  13. Public Function IMakeFood() As Food Implements IMaid.IMakeFood
  14. Return New pizz '返回披萨实例化的类
  15. End Function
  16. End Class
  17. ‘单机button加一个
  18. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
  19. Dim ying As IMaid = New ying '声明女仆实例化樱
  20. Label1.Text = ying.IMakeFood().Edible() '樱做披萨
  21. End Sub
  22. </span>

效果图



优点、两张图带

用设计模式之前的多对多关系、假设在加一个食物、你我他三个类都要做更改

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDE5MTAzNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

用设计模式之后的、仅仅要知道工厂类即可了、与食物类解耦和、扩展的话就加一个食物类加一个工厂类、client调用即可

—————————————————够明显了吧—————————————————

——————————工厂方法——————————

————chenchen————

设计模式-工厂方法(Demo)的更多相关文章

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  3. iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. ...

  4. javascript设计模式-工厂方法模式

    工厂方法模式笔记  通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例  对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在  通过工厂方法模 ...

  5. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

  6. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

  7. C#设计模式——工厂方法

    一.为什么需要工厂方法      工厂方法可以这么理解.你规定了一个规范,只要符合这个规范.那么就可以按照你的方式进行操作,这样你就无需知道具体操作的对象是什么,具有什么特性等等,可以进行统一化的操作 ...

  8. Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

    工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的 ...

  9. 设计模式--工厂方法模式(Factory method pattern)及应用

    面向对象的好处: 通过封装,继承,多态把程序的耦合度降低. 用设计模式可以使程序更加灵活,容易修改,且易于复用. 1. 工厂方法模式 Define an interface for creating ...

随机推荐

  1. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  2. 中国Azure媒体服务RESTAPI的Endpoint

    Amber Zhao  Thu, Feb 26 2015 4:09 AM 由于海外Azure和中国Azure有不同的domain,很多用户在使用媒体服务RESTAPI时,需要指定中国Azure媒体服务 ...

  3. Java [Leetcode 242]Valid Anagram

    题目描述: Given two strings s and t, write a function to determine if t is an anagram of s. For example, ...

  4. mkimage的-a 和 –c参数和内核引导

    目录 一.mkimage工具简介二.-a参数与-e参数和内核引导的关系三.实例测试 3.1 -a参数与-e参数相同,可以将内核下载到SDRAM的任何地址,然后从这启动 3.2 -a参数与-e参数不同, ...

  5. memcached 学习笔记

    memcached是高性能的分布式内存缓存服务器.一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态应用的速度.提高可扩展性. Memcached基于一个存储键/值对的hashm ...

  6. FZU1686 神龙的难题 dancing links 重复覆盖

    分析:每次可以打一个小矩阵的怪,然后把每个怪看成一列,然后每个小矩阵看成一行,枚举左上角就行 注:然后注意总共的节点数是新图的行*列的个数,不是原图 #include<cstdio> #i ...

  7. 基于野火M3开发板(STM32F103VET6)的迷宫小球(重力感应控制)游戏开发

    2013-03-03 这是研一上学期<实时嵌入式系统实验>课程的大作业,是利用野火板的资源,加上一个AHRS(Attitude and Heading Reference System,姿 ...

  8. 【原创】_INTSIZEOF 内存按照int对齐

    #include <stdarg.h> 里面定义了如下宏 #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(siz ...

  9. MySQL Workbench 导出数据库脚本(图文)

    1.如下图红框所示,在Server Administration那里,点击"New Server Instance" 2.如下图所示,如果是连接本地数据库,则选localhost, ...

  10. SQL2008-删除时间字段重复的方法

    ID  EMAgitation_ID    YieldDateTime 1   2                              2012-02-11 10:18:54.0002   2  ...