抽象工厂模式(abstract)创建型模式

(一)简单工厂模式?

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

 

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

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

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

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

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

     

 

 

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

   

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

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

     

     

 

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

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

   

 

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

 

[csharp] view plain copy
 
  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.    }  


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

 

[csharp] view plain copy
 
  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

 

[csharp] view plain copy
 
  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的行为:向右移动和向下跳跃

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

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

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

 

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


最后在客户端新增

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

posted @ 2018-02-26 14:29  烟雨楼台^浮云往事  阅读(399)  评论(0编辑  收藏  举报