c#面向对象系列4(设计方法模式)

   在简单工厂模式中,一个工厂处于对产品类进行实例化的中心位置,他知道每一个产品类的细节,并决定何时哪一个产品类应当被实例化。简单工厂模式的优点是能够使客户端独立于产品的创建过程,并且在系统中引入新产品时无需对客户端进行修改,缺点是当有新产品加入到系统中的时,必须修改工厂类,以加入必要的处理逻辑。简单工厂模式的致命弱点就是处于核心地位的工程类,因为一旦他无法确定要对那个类进行实例化,就无法使用该模式,而工厂方法模式则可以很好的解决这个问题。

       简单方法模式可分为:

      (1)Product:产品角色     在我们c#中一般使用抽象类和接口实现

                 定义产品的接口

      (2)CreateProduct:真实的产品

                 实现接口Product类     这个类一般是继承产品角色的类,而且对里面生成产品的方法进行重写。

     (3)Creator:工厂角色

                  声明工厂角色(FactorMethod) 这个是简单工厂模式的核心类,此处一般为抽象类,抽象工厂,表示出生成何种实例化的产品,具体的实例化类须需要的是真实的工程去进行实例。

    (4)ConcreteCreator:真实的工厂

         这个是工厂方法的具体实现,一般继承与工厂角色的抽象类,实现具体的实例化。

案例:

   大学毕业时对个人的能力进行分析时,可以这样的去分析,一个人的教育背景,所学课程,结业成绩等这些是所有毕业生所具有的共同的属性,而这其中个人所获得的技能证书,奖项等分人而论,所以综上的分析,所有的技能继承于一个类pages类,而当我们实例化时所要区分技能由抽象工厂来区分。

如下:

//这个是工厂方法模式,

 namespace MultiPage

{    

 //产品的基类,(抽象产品角色)  

   abstract class Page    

 {

    }   

  //这个是生产产品的工厂   (抽象工厂角色)   

  abstract class Document  

   {      

   protected ArrayList pages = new ArrayList();  

  //这个是页面的列表       

  public Document()    

     {            

 this.CreatePages();      

   }

        public ArrayList Pages    

     {         

    get { return pages; }      

   }       

  //抽象方法   

此方法在派生类中重写此方法       

  abstract public void CreatePages();  

   }    

//派生类具体产品类——技能页 (具体产品角色)    

class Skillspage : Page    

 {   

  }    

//派生产品类——教育页       (具体的产品角色)  

   class EducationPage : Page   

  {  

   }

    //派生产品类——介绍页        (具体产品角色)  

   class IntroductionPage : Page   

  {  

   }  

   //派生结果类                  (具体产品角色)   

  class ResultPage : Page   

  {   

  }   

  //具体工厂类一个人简历,包括技能,教育,经验            (具体工厂角色)   

  class Resume : Document     

 {        

 //工厂方法的具体实现   这里边是对页面的重写

        public override void CreatePages()       

  {            

 pages.Add(new Skillspage());   

 pages.Add(new EducationPage());

 //throw new NotImplementedException();      

   }   

  }   

  //具体工厂类——个人报告,结果,结论,总结,文献              (具体工厂2角色)   

  class Report : Document   

  {       

 public override  void CreatePages()        

 {            

 pages.Add(new IntroductionPage());            

 pages.Add(new ResultPage());      

   }   

  }

}

但我们应用时可创建不同类的实例:

  static void Main(string[] args)     

    {           

  Document[] docs = new Document[2];             //在构造函数调用了Factory Method,创建两种文档    

         docs [0]=new Resume ();     

        docs [1]=new Report ();             //显示文档的内容          

   foreach (Document   document  in docs )        

     {             

    Console .WriteLine ("\n"+document +"————————————————");        

         foreach (Page  page  in document .Pages )              

       Console .WriteLine ("     "+page );          

   }           

  Console .Read ();      

   }

原文地址:https://www.cnblogs.com/zhijianliutang/p/2250659.html