大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C#之工厂模式

C#之工厂模式(2)

关键词:工厂模式C#  阅读(1012) 赞(13)

[摘要]本文是对C#之工厂模式的讲解,与大家分享。

 Component rightcomponent = IronManComponentFactory.CreateComponent("RightCom");
 Component leftcomponent = IronManComponentFactory.CreateComponent("LeftCom");
 rightcomponent.Self_Described();
 leftcomponent.Self_Described();

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

工厂方法

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

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

 public abstract class IronManComponentFactory
     {
         protected string factoryName = string.Empty;
         protected void InitDataMessage()
         {
             Console.WriteLine("生产机器:" + factoryName + ".准备就绪");
         }
         public abstract Component CreateComponent();
     }
 public class RightComFactory:IronManComponentFactory
     {
 
         public override Component CreateComponent()
         {
             base.factoryName = "右臂部件生产器";
             InitDataMessage();
             return new RightHandComponent();
         }
     }
 public class LeftComFactory:IronManComponentFactory
     {
 
         public override Component CreateComponent()
         {
             base.factoryName = "左臂部件生产器";
             InitDataMessage();
             return new LeftHandComponent();
         }
     }
 public class PottingFactrory
     {
         /// <summary>
         /// 取件口
         /// </summary>
         /// <param name="comFactory"></param>
         /// <returns></returns>
         public static Component ComExit(IronManComponentFactory comFactory)
         {
             if (comFactory != null)
             {
                 return comFactory.CreateComponent();
             }
             return null;
         }
     }

我们通过“取件口”取件

 Component component = PottingFactrory.ComExit(new RightComFactory());
 component.Self_Described();

我们只要通过更换“生产插件”,从“取件口”获得不同的部件。 或者更改需求,又要生产符合“规范说明书”的另一些产品的时候,可以自定义来实现“生产插件”,插入“生产机器”即可。

这样可以送给“玩具厂”使用了。这次得到了很好的一个评价,我也可以休息一下了。

这里的工厂方法是开闭原则(OCP)的实现,很优雅的显示出了设计原则和设计模式的美。

抽象工厂

“对,没错。‘玩具厂’又来了……。”
这次“玩具厂”是把Iron部件升级了,二代部件出来了,是在一代的基础上做了一些个性化的设计。来看新增部件的“图纸”

     public class RightHandComponent2 : Component
     {
         public RightHandComponent2() : this("毅代先锋号二代右部件") { }
         public RightHandComponent2(string strname)
         {
             base.Name = strname;
         }
         public override void Self_Described()
         {
             Console.WriteLine("自描述:我是->" + base.Name);
         }
     }
 
     public class LeftHandComponent2 : Component
     {
         public LeftHandComponent2() : this("毅代先锋号一代左部件") { }
         public LeftHandComponent2(string strname)
         {
             base.Name = strname;
         }
         public override void Self_Described()
         {
             Console.WriteLine("自描述:我是->" + base.Name);
         }
     }

按照“规范说明书”,添加了两张“图纸”,它们分别是二代的左右手部件。

部件的整体结构没怎么变,但是“生产机器”的“规范说明”就要更改了,以为在上面说到的“生产插件”也要重新更改。

先来看一下“生产机器”的“规范说明”:

    public abstract class IronManComponentFactory
    {
        protected string factoryName = string.Empty;
        protected void InitDataMessage()
        {
            Console.WriteLine("生产机器:" + factoryName + ".准备就绪");
        }
        public abstract Component CreateComponent();
        public abstract Component CreateComponent2();
 
 
    }

当然喽,“规范说明”都改了,那上面说过的两个生产插件也得改了:

 public class RightComFactory : IronManComponentFactory                   //右部件生产插件
     {
 
         public override Component CreateComponent()
         {
             base.factoryName = "新右臂部件生产器";
             InitDataMessage();
             return new RightHandComponent();
         }
 
         public override Component CreateComponent2()
         {
             base.factoryName = "新右臂部件生产器";
             InitDataMessage();
             return new RightHandComponent2();
         }
     }
 
 public class LeftComFactory : IronManComponentFactory              //左部件生产插件
     {
 
         public override Component CreateComponent()
         {
             base.factoryName = "新左臂部件生产器";
             InitDataMessage();
             return new LeftHandComponent();
         }
 
         public override Component CreateComponent2()
         {
             base.factoryName = "新左臂部件生产器";
             InitDataMessage();
             return new LeftHandComponent2();
         }
     }

所要做的修改都是连带关系,包装”生产机器“的”取件口“也要改:

 public class PottingFactory
    {
        private IronManComponentFactory comFactory = null;
 
        public IronManComponentFactory ComFactory
        {
            get { return comFactory; }
            set { comFactory = value; }
        }
        public PottingFactory(IronManComponentFactory comFactory)
        {
            this.comFactory = comFactory;
        }
        /// <summary>
        /// 取件口
        /// </summary>
        /// <param name="comFactory"></param>
        /// <returns></returns>
        //public static Component ComExit(IronManComponentFactory comFactory)
        //{
        //    if (comFactory != null)
        //    {
        //        return comFactory.CreateComponent();
        //    }
        //    return null;
        //}
    }

到这里就差不多结束了。在工厂方法模式上 做了稍稍的(几乎全改了)改动。

当然自己要先来测试一下喽:

 PottingFactory pottingfact = new PottingFactory(new RightComFactory());
 Component component= pottingfact.ComFactory.CreateComponent();
 component.Self_Described();
 component = pottingfact.ComFactory.CreateComponent2();
 component.Self_Described();

我们来看一下结果:

«上一页12下一页»


相关评论