首页 > 学院 > 开发设计 > 正文

C#设计模式之工厂

2019-11-17 03:11:30
字体:
来源:转载
供稿:网友

C#设计模式之工厂

IronMan之工厂

前言

实用为主,学一些用得到的技术更能在如今的社会里保命。 虽然在日常的工作中设计模式不是经常的用到,但是呢,学习它只有好处没有坏处。

设计模式像是一种“标签”,它是代码编写者思想的体现。有木有感觉到这样很便捷?看到一些代码的时候就很清楚的了解编写者的思想了,这是为什么呢?因为编写者们用了“标签”,而你恰恰是知道“标签”意思的。 跟一异曲同工,在学习框架、了解框架的对象模型的时候,“标签”是时常出现,如果你不了解“标签”的意思那多痛苦啊!!!!! 还有好多,不去一一阐述了。

工作中需求的变更时常令我们头疼不已,总是要按着需求来重新的修改代码,然后发布新的产品版本,或者是出更新包。 在需求变更中,对应着代码也要修改,但是这修改也是分层次的。比如修改的模板在当初设计的时候遵循了开闭原则(OCP)的话,代码的修改就变的轻松的多了。

我想制造出一个像电影《钢铁侠》里面那样的的一身盔甲,又或者说是机器吧,我把这个想法告诉了我的朋友们,他们都认为我疯了。

好吧,我说的是用代码抽象的制造出”钢铁侠“

废话不多说,下面这个系列是用钢铁侠(IronMan)作为主题的设计模式 今天来学习简单工厂模式、工厂方法模式、以及抽象工厂模式。

问题的发现

需求:“玩具厂”有一天找到我说:“Jin叫兽我们这需要一些部件,我们会提供“图纸”,请您帮忙制造,您看有问题吗?”。我:“当然没有问题了。很乐意帮助你们”。“玩具厂”:“噢!好的。Jin叫兽,时间方面还有什么问题嘛?”我:“没问题的,我会尽快的”。“玩具厂”:“那真的太感谢您了,Jin叫兽。我们就不打扰您了,先走了。”我:“晚上一起吃顿饭吧”。“玩具厂”:“Jin叫兽不必客气啊”。我:“好,你们慢走”。

生产车间:“一点挑战性都没有,随随便便就制造出来了。先从组成‘钢铁侠’的部件开始生产吧。”既然是这样,那就从部件开始生产吧。这里是“玩具厂”提供的“钢铁侠”右臂的“图纸”:

 1     public class RightHandComponent 2     { 3         public RightHandComponent() 4         { 5             this.strName = "毅代先锋号一代右部件"; 6              7         } 8         public RightHandComponent(string strname) 9         {10             this.strName = strname;11         }12         PRivate string strName = string.Empty;13         public string Name14         {15             get { return strName; }16             set { strName = value; }17         }18     }

还有一个左臂部件的“图纸”:

 1     public class LeftHandComponent 2     { 3         public LeftHandComponent() 4         { 5             this.strName = "毅代先锋号一代左部件"; 6         } 7         private string strName = string.Empty; 8         public string Name 9         {10             get { return strName; }11             set { strName = value; }12         }13     }

还有若干“图纸”…… 不在这篇一一列举了,在后面文章中会全面的讲解到。

开始生产

RightHandComponent rightcomponent = new RightHandComponent();LeftHandComponent leftcomponent = new LeftHandComponent();

若干的部件 被我一个个的按照图纸给制造了出来。这样就可以拿rightcomponent、leftcomponent……等等的一些制造好的部件组装了。我也可以给“玩具厂”打电话了,可以交货收钱。可是电话打完情况又变了,中间的对话就不说了,“玩具厂”的意思就是这样的。比如说“运输途中”出现“损坏”,他们希望用一个很快捷便利的方式能得到部件。

简单工厂

嗯,我想了一下,不过对于我Jin叫兽来说都是小事,待我造出来一台部件生产器来。他们拿着机器自己回家生产不就ok了。

    public class IronManComponentFactory    {        public static object CreateComponent(string comname)        {            switch (comname)            {                case "RightCom":                    return new  RightHandComponent();                case "LeftCom":                    return new  LeftHandComponent();                等等……            }            return null;        }    }

这样生产的“机器”就好了,我得自己试用一下,看看效果怎么样。

1 RightHandComponent rightcomponent = IronManComponentFactory.CreateComponent("RightCom") as RightHandComponent;2 LeftHandComponent leftcomponent = IronManComponentFactory.CreateComponent("LeftCom") as LeftHandComponent;

这样反而多此一举了,第一步,向机器输入了命令以便自己获得想要的部件,第二步,在生产出来后我还得把“图纸”拿过来比对一下。 在我一筹莫展的时候,“玩具厂”给我发了个邮件,给我发了一份“部件规范说明书”,要求我的机器生产出的部件是达到说明书标准的。

那我们就来看一下这个所谓的“部件规范说明书”

 1    public abstract class Component 2    { 3         private string strName = string.Empty; 4         /// <summary> 5         /// 名称 6         /// </summary> 7         public string Name 8         { 9             get { return strName; }10             set { strName = value; }11         }12         /// <summary>13         /// 自我描述14         /// </summary>15         public abstract void Self_Described();16     }

看完这个“部件规范说明书”,我已经无力吐槽,没办法了,只有重新设计部件了,“图纸”要重新绘制,因为要按照那该死的“规范说明书”。再看一下各个部件的“图纸”

 1     public class RightHandComponent:Component 2     { 3         public RightHandComponent() 4         { 5            base.Name = "毅代先锋号一代右部件"; 6             //fWeight=材质输出 7         } 8         public RightHandComponent(string strname) 9         {10             base.Name = strname;11         }12         public override void Self_Described()13         {14             Console.WriteLine(base.Name);15         }16     }17     public class LeftHandComponent:Component18     {19         public LeftHandComponent()20         {21             base.Name = "毅代先锋号一代左部件";22         }23         public LeftHandComponent(string strname)24         {25             base.Name = strname;26         }27         public override void Self_Described()28         {29             Console.WriteLine(base.Name);30         }31     }

等等一些部件……

这下我再把原来的搭好的“生产机器”拆了,内部修改一下,来看一下修改后的“机器”

 1     public class IronManComponentFactory 2     { 3         public static Component CreateComponent(string comname) 4         { 5             switch (comname) 6             { 7                 case "RightCom": 8                     return new RightHandComponent(); 9                 case "LeftCom":10                     return new LeftHandComponent();11 12             }13             return null;14         }15     }

自己来测试一下:

1 Component rightcomponent = IronManComponentFactory.CreateComponent("RightCom");2 Component leftcomponent = IronManComponentFactory.CreateComponent("LeftCom");3 rightcomponent.Self_Described();4 leftcomponent.Self_Described();

于是,我很放心的就交给了“玩具厂”使用了,还得了个好评。

工厂方法

好景不长,“玩具厂”再次来电,提出一个要求,想让我的“生产机器”里面还可以生产更多的符合“部件规范说明书”的部件。

这样说来是要改装“生产机器”了。 可以说“玩具厂”是故意的,绝对是故意的。这下整蒙圈了,亏血本了,“生产机器”又要拆了…… 直接来看“生产机器”的图纸

 1 public abstract class IronManComponentFactory 2     { 3         protected string factoryName = string.Empty; 4         protected void InitDataMessage() 5         { 6             Console.WriteLine("生产机器:" + factoryName + ".准备就绪"); 7         } 8         public abstract Component CreateComponent(); 9     }10 public class RightComFactory:IronManComponentFactory11     {12 13         public override Component CreateComponent()14         {15             base.factoryName = "右臂部件生产器";16             InitDataMessage();17             return new RightHandComponent();18         }19     }20 public class LeftComFactory:IronManComponentFactory21     {22 23         public override Component CreateComponent()24         {25             base.factoryName = "左臂部件生产器";26             InitDataMessage();27             return new LeftHandComponent();28         }29     }30 public class PottingFactrory31     {32         /// <summary>33         /// 取件口34         /// </summary>35         /// <param name="comFactory"></param>36         /// <returns></returns>37         public static Component ComExit(IronManComponentFactory comFactory)38         {39             if (comFactory != null)40             {41                 return comFactory.CreateComponent();42             }43             return null;44         }45     }
View Code

我们通过“取件口”取件

1 Component component = PottingFactrory.Com
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表