工厂方法模式

    技术2022-05-11  148

     1。概述

             工厂方法是一个粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法主要创建与某个类相关的类的实例。

    2。意图

           定义一个用于创建对象的接口(这里是一个抽象的方法),让包含这个接口的类的子类决定到底实例化哪一个类。工厂方法使一个类的实例化延迟到了子类。

    3。使用场合

         当一个类不知道它具体要创建对象的类或者一个类希望由子类指定它所创建的对象时,可是使用工厂方法模式。

    4。效果

         工厂方法使类中的代码不依赖它必须创建的类,代码只要知道它需要创建的类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。

    5。程序实例

          我们先看一个小的例子,这个例子主要是获得不同类的实例的迭代器。程序如下:

    using  System; using  System.Collections; namespace  FactoryMethod2{     ///   <summary>      ///  Class1 的摘要说明。     ///   </summary>      class  Class1    {         ///   <summary>          ///  应用程序的主入口点。         ///   </summary>         [STAThread]         static   void  Main( string [] args)        {             //              //  TODO: 在此处添加代码以启动应用程序             //             ArrayList ar = new  ArrayList();            IEnumerator e = ar.GetEnumerator();            System.Console.WriteLine(ar.GetType().Name + " 的迭代器类型 " + e.GetType().Name);            String s = "" ;            IEnumerator se = s.GetEnumerator();            System.Console.WriteLine(s.GetType().Name + " 的迭代器类型 " + se.GetType().Name);             System.Console.ReadLine();        }    }}

    运行的结果如图:

    6。工厂方法的结构

    结构如图:

    7。一个更加形象的例子---鸟生蛋

     该例子的类图如下:

    下面是程序的源代码:

    鸟的类,它包含一个Produce()的抽象方法

    using  System;namespace  FactoryMethod{    /// <summary>      ///  Bird 的摘要说明。    /// </summary>     public abstract class  Bird    {        #region 属性          protected string  name;        #endregion          #region 方法          public  Bird()        {            //              //  TODO: 在此处添加构造函数逻辑             //         }        public Bird(string  name)        {            this.name= name;        }        public string  Name        {            get             {                 return this .name;            }        }        public abstract  Egg Produce();        #endregion     }}

    鸡的类,它从鸟类继承下来

    using  System; namespace  FactoryMethod{     ///   <summary>      ///  Class2 的摘要说明。     ///   </summary>      public   class  Chicken:Bird    {         public  Chicken()        {             //              //  TODO: 在此处添加构造函数逻辑             //              this .name = " " ;        }         public   override  Egg Produce()        {             return   new  ChickenEgg();        }    }}

    鸭子的类,从鸟类中继承

    using  System; namespace  FactoryMethod{     ///   <summary>      ///  Duck 的摘要说明。     ///   </summary>      public   class  Duck:Bird    {         public  Duck()        {             //              //  TODO: 在此处添加构造函数逻辑             //              this .name = " " ;        }         public   override  Egg Produce()        {             return   new  DuckEgg();        }    }}

    蛋类,它是一个抽象的类

    using  System; namespace  FactoryMethod{     ///   <summary>      ///  Egg 的摘要说明。     ///   </summary>      public   class  Egg    {         #region  属性          protected   string  name;         #endregion          #region  方法          public  Egg()        {             //              //  TODO: 在此处添加构造函数逻辑             //         }         public  Egg( string  name)        {             this .name = name;        }         public   string  Name        {             get             {                 return   this .name;            }        }         #endregion     }}

    鸡蛋的类(从蛋类继承)

    using  System;namespace  FactoryMethod{    /// <summary>      ///  ChickenEgg 的摘要说明。    /// </summary>     public class  ChickenEgg:Egg    {        public  ChickenEgg()        {            //              //  TODO: 在此处添加构造函数逻辑             //            this.name="鸡蛋" ;        }    }}

    鸭蛋的类(从蛋类继承)

    using  System;namespace  FactoryMethod{    /// <summary>      ///  DuckEgg 的摘要说明。    /// </summary>     public class  DuckEgg:Egg    {        public  DuckEgg()        {            //              //  TODO: 在此处添加构造函数逻辑             //            this.name="鸭蛋" ;                    }    }}

    客户端程序

    using  System; namespace  FactoryMethod{     ///   <summary>      ///  Class1 的摘要说明。     ///   </summary>      class  Class1    {         ///   <summary>          ///  应用程序的主入口点。         ///   </summary>         [STAThread]         static   void  Main( string [] args)        {             //              //  TODO: 在此处添加代码以启动应用程序             //             Chicken chicken = new  Chicken();            System.Console.WriteLine(chicken.Name + "  生  " + chicken.Produce().Name);            Duck duck = new  Duck();            System.Console.WriteLine(duck.Name + "  生  " + duck.Produce().Name);            System.Console.ReadLine();        }    }}

    程序运行的结果如下:

     


    最新回复(0)