(一)简单工厂模式?

现在的学习是面向对象面向接口的,但是执行时的操作需要实例化后的对象。随着我们需要的类的增加,我们就需要把这些共同的东西提取出来,放在一个抽象类中,让这些子类来继承抽象类。当我们调用具体的类时,需要首先实例化它们,而实例化必须要针对具体的类。如果直接实例化,则破坏了面向接口的原则,实例化一个具体的类就要根据父类把所有的子类选择一遍才可以实例化,这样的运算时间就大大增多。这时我们就需要有一个地方来供我们选择要实例化哪个类,而不需要我们知道怎么创建和调用类的,这就是简单工厂模式(Simple Factory Pattern )。通俗的说就是有一个专门的类来负责创建实例的过程。

简单工厂模式的图形表示:

首先这个模式有三个角色:

1、工厂角色:核心部分,负责实现创建所有实例的内部逻辑(选择分支),被外界调用的接口,创建所需的对象。

2、抽象类角色:所要创建的类的抽象父类,描述类所有实例所共有的公共接口。可以是抽象类也可以是接口。

3、具体类角色:所要创建的具体实例对象。它们拥有共同的父类。

简单工厂模式的应用以及代码实现

在某个炎热的夏天,我们的学校突然来了一群新伙伴,那就是一批自动售货机,分布在学校的每一个角落,包括我们的五楼电梯口。当你投入硬币取出一瓶冰凉的饮料时,有没有想过我们可以把它写成一个简单工厂模式呢?至少去年的夏天还没有学设计模式的我不会。

当一个人想要喝里面的饮料时,他自己是不会做饮料或者是冰镇的,这说明人这个对象不用自己去创建各种饮料的对象;每个人都有每个人的爱好,来到售货机前,只要投入钱自己点按钮就可以了。这个时候我们就抽象出一些对象的类。例如要买饮料的人就是一个类、各种饮料抽象成为一个饮料类、每种饮料包括(美年达、雪碧、奶咖)之类的就是具体的饮料对象。uml类图如下:

我们首先写这个抽象的类,饮料类

  1. //抽象出的一个父类角色
  2. public abstract class Drink
  3. {
  4. public abstract string DrinkShow();
  5. }

接着是一些具体的饮料子类,它们有共同的父类饮料类。有共同的行为和属性。

  1. //具体角色
  2. class 美年达:Drink
  3. {
  4. //获取一瓶美年达
  5. public override string DrinkShow()
  6. {
  7. return "你选择的是美年达";
  8. }
  9. }
  10. class 雪碧:Drink
  11. {
  12. //获取一瓶雪碧
  13. public override string DrinkShow()
  14. {
  15. return "您选择的是雪碧";
  16. }
  17. }
  18. class 可口可乐:Drink
  19. {
  20. //获取一瓶可口可乐
  21. public override string DrinkShow()
  22. {
  23. return "您选择的是可口可乐";
  24. }
  25. }

然后建立一个自动售货机的工厂来出饮料:

  1. //现在建立一个自动售货机工厂类
  2. public class DrinkFactory
  3. {
  4. public static Drink createDrink(string type)
  5. {
  6. Drink dri=null ;
  7. switch (type )
  8. {
  9. case "美年达":
  10. dri = new 美年达();
  11. break;
  12. case "雪碧":
  13. dri = new 雪碧();
  14. break;
  15. case "可口可乐":
  16. dri = new 可口可乐();
  17. break;
  18. }
  19. return dri;
  20. }
  21. }

最后建立测试客户端,就是主函数main

  1. static void Main(string[] args)
  2. {
  3. try
  4. {
  5. //实例化各种饮料
  6. Drink 美年达 = DrinkFactory.createDrink("美年达");
  7. Drink 雪碧 = DrinkFactory.createDrink("雪碧");
  8. Drink 可口可乐 = DrinkFactory.createDrink("可口可乐");
  9. //获取饮料
  10. if (美年达 != null)
  11. {
  12. Console.WriteLine(美年达.DrinkShow());
  13. }
  14. if (雪碧 != null)
  15. {
  16. Console .WriteLine ( 雪碧.DrinkShow());
  17. }
  18. if (可口可乐 != null)
  19. {
  20. Console .WriteLine(可口可乐.DrinkShow());
  21. }
  22. }
  23. catch(Exception ex)
  24. {
  25. Console.WriteLine("您输入有错:" + ex.Message);
  26. }
  27. }

输出结果如下:

(二)抽象工厂模式(abstract)创建型模式 c#简单例子

适用于玩家用户数play1、play2....有变化,而行为move、jum无变化时

玩家playone的行为:向左移动和向上跳跃

玩家playtwo的行为:向右移动和向下跳跃

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace adapterpattern
  10. {
  11. public partial class abstractForm : Form
  12. {
  13. public abstractForm()
  14. {
  15. InitializeComponent();
  16. }
  17. private void btnDisplay_Click(object sender, EventArgs e)
  18. {
  19. playFactory pf1 = new playone();//隐藏行为move和jump.
  20. playWorld p1 = new playWorld(pf1);//行为向左移动和向上跳跃
  21. this.listBox1.Items.Add(p1.createPlay());
  22. playWorld p2 = new playWorld(new playtwo());//行为向右移动和向下跳跃
  23. this.listBox1.Items.Add(p2.createPlay());
  24. }
  25. }
  26. public class playWorld//实体工厂和抽象工厂的交接
  27. {
  28. imove move;
  29. ijump jump;
  30. public playWorld(playFactory pp)
  31. {
  32. this.move = pp.move();
  33. this.jump = pp.jump();
  34. }
  35. public string createPlay()
  36. {
  37. move.move();
  38. jump.jump();
  39. return move.movestring + jump.jumpstring;
  40. }
  41. }
  42. public abstract class playFactory//抽象工厂
  43. {
  44. public abstract imove move();
  45. public abstract ijump jump();
  46. }
  47. public class playone : playFactory//抽象工厂实例1
  48. {
  49. public override imove move()
  50. {
  51. return new leftmove();
  52. }
  53. public override ijump jump()
  54. {
  55. return new topJump();
  56. }
  57. }
  58. public class playtwo : playFactory//抽象工厂实例2
  59. {
  60. public override imove move()
  61. {
  62. return new rightmove();
  63. }
  64. public override ijump jump()
  65. {
  66. return new downJump();
  67. }
  68. }
  69. public abstract class imove//抽象行为imove
  70. {
  71. public string movestring;
  72. public abstract void move();
  73. }
  74. public abstract class ijump//抽象行为jump
  75. {
  76. public string jumpstring;
  77. public abstract void jump();
  78. }
  79. public class leftmove : imove//move行为实例1
  80. {
  81. public override void move()
  82. {
  83. movestring = "左移动";
  84. }
  85. }
  86. public class rightmove : imove//move行为实例2
  87. {
  88. public override void move()
  89. {
  90. movestring = "右移动";
  91. }
  92. }
  93. public class topJump : ijump//jump行为实例1
  94. {
  95. public override void jump()
  96. {
  97. jumpstring = "向上跳";
  98. }
  99. }
  100. public class downJump : ijump//jump行为实例2
  101. {
  102. public override void jump()
  103. {
  104. jumpstring = "向下跳";
  105. }
  106. }
  107. }

当需要增加新玩家时,只要再增加一个继承playfacotry的类,其他都不需要改动

新玩家行为:向左移动和向下跳跃

  1. public class newplay:playFactory//新增加玩家:向左移动和向下跳跃
  2. {
  3. public override imove move()
  4. {
  5. return new leftmove();
  6. }
  7. public override ijump jump()
  8. {
  9. return new downJump();
  10. }
  11. }

最后在客户端新增

playWorld newp = new playWorld(new newplay());
            this.listBox1 .Items .Add (newp .createPlay ());

抽象工厂模式(abstract)创建型模式的更多相关文章

  1. 设计模式04: Factory Methord 工厂方法模式(创建型模式)

    Factory Methord 工厂方法模式(创建型模式) 从耦合关系谈起耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更 -模块与模块之间的 ...

  2. 抽象工厂(Abstract Factory)模式

    一.抽象工厂(Abstract Factory)模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family ...

  3. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

  4. 设计模式03: Builder 生成器模式(创建型模式)

    Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...

  5. Java设计模式02:常用设计模式之工厂模式(创建型模式)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.  工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...

  6. 设计模式的征途—3.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  7. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  8. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  9. 【java设计模式】之 抽象工厂(Abstract Factory)模式

    1. 女娲的失误 上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别--这失误也忒大了点吧--竟然没有性别,那岂不是--无奈,只好抹掉重来了,于是所有人都被消灭掉了 ...

随机推荐

  1. 原生javascript-Tab选项卡-面向对象

    分析个人用原生JS获取类名元素的代码: getByClassName:function(className,parent){ var elem = [], node = parent != undef ...

  2. JS判断键盘上的上下左右键

    document.onkeydown=function(event){ var e = event || window.event || arguments.callee.caller.argumen ...

  3. iptables详解(13):iptables动作总结之二

    概述 阅读这篇文章需要站在前文的基础上,如果你在阅读时遇到障碍,请参考之前的文章. 前文中,我们已经了解了如下动作 ACCEPT.DROP.REJECT.LOG 今天,我们来认识几个新动作,它们是: ...

  4. commons-fileupload实现上传进度条的显示

    本文将使用   apache fileupload   ,spring MVC   jquery 实现一个带进度条的多文件上传, 由于fileupload 的局限,暂不能实现每个上传文件都显示进度条, ...

  5. 002——vue小结

    1.new 一个vue对象的时候你可以设置他的属性,其中最重要的包括三个,分别是:data,methods,watch. 2.其中data代表vue对象的数据,methods代表vue对象的方法,wa ...

  6. LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  7. qml 音乐播放器的进度条

    进度条采用qml的Slider组件 样式什么的,网上很多.我就不列举了.接下来主要说明,进度条是怎样按秒移动的. Slider { id: control    value: 0 stepSize: ...

  8. igmpproxy源代码学习——igmpProxyInit()

    igmpproxy源代码学习--igmpProxyInit()函数详解,igmpproxy初始化 在运行igmpproxy的主程序igmpproxyRun()之前需要对igmpproxy进行一些配置, ...

  9. Python的介绍及Pycharm软件的安装

    一.Python介绍 1.  Python是一种解释性.面向对象.动态数据类型的高级程序设计语言. Python语言创始人是吉多.范罗苏姆:起源与1989年 2.  缺点:运行速度慢(由于是解释性语言 ...

  10. spring framework各个版本下载网址

    spring framework各个版本下载网址 http://repo.spring.io/simple/libs-release-local/org/springframework/spring/