设计模式之( Factory Method Pattern--工厂方法模式)

定义:工厂方法又称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。

简单的说:想象一种模型,假设有一种工具是由零件组合而成的,当我们用1方式合成这种工具时候,它可以被A,B,C。。使用;用2方式合成这种工具时候,它可以被B,C,D。。使用;等等;但A,B。。具有相同的特征(从分类角度看书属于同意类型)。这里的工具就可以当作是抽象工厂,1方式和2方式的工具可以看作是具体的工厂,

文字描述实际案例:多文档系统。文档是有多种Page组成,具体Page包括SkillPage(技能页面),EducationPage(报表页),IntroductionPage(介绍页)等等,都具有Page类型特性,而Document(文档)是一个抽象类,它可以派生出具体的多种形式的文档,如Resume个人简历(包含SkillPage,EducationPage等),Report报告(包含IntroductionPage等)

优缺点:优:建立客户所需要的产品,同时象客户向客户隐藏了具体产品类将被实例化这个细节,在系统加入新产品类的时候,无需修改抽象工厂和抽象产品所提供的接口,无需修改客户端,只要添加一个具体的工厂和具体的产品就可以了。缺:在添加新产品时候,需要编写新的具体产品类,还要提供与之对应的具体工厂类,当两者都比较简单时,系统会有相对额外的开销。

应用情景:1.类不知道自己要创建哪一个对象。2.类用它的子类来指定创建哪一个对象。3.客户需要清楚创建了哪一个对象。

具体代码:

 

#region
using  System;
using  System.Collections;

namespace  MultiPage
{
    
#region
    
// 产品基类
     abstract   class  Page
    { }
    
#endregion
    
#region
    
// 工厂抽象类
     abstract   class  Document
    {
        ArrayList pages 
=   new  ArrayList();
        
public  Document()
        {
            
this .CreatePages();
        }
        
public  ArrayList Pages
        {
            
get  {  return  pages; }
        }
        
// Factory Method
         abstract   public   void  CreatePages();
    }
    
#endregion
    
#region
    
// 派生类,具体产品类--技能页
     class  SkillPage : Page
    { }

    
// 派生类,具体产品类--教育页
     class  EductionPage : Page
    { }

    
// 派生类,具体产品类--经验页
     class  ExperiencePage : Page
    { }

    
// 派生类,具体产品类--介绍页
     class  IntroductionPage : Page
    { }

    
// 派生类,具体产品类--结果页
     class  ResultPage : Page
    { }

    
// 派生类,具体产品类--结论页
     class  ConclusionPage : Page
    { }

    
// 派生类,具体产品类--总结页
     class  SummaryPage : Page
    { }

    
// 派生类,具体产品类--文献页
     class  BibliographyPage : Page
    { }
    
#endregion
    
#region
    
// 具体工厂类--个人简历,包含技能,教育,经验
     class  Resume : Document
    {
        
// Factory Method 实现
         override   public   void  CreatePages()
        {
            pages.Add(
new  SkillsPage());
            pages.Add(
new  EducationPage());
            pages.Add(
new  ExperiencePage());
        }
    }
    
#endregion
    
#region
    
// 具体产品类--报告,包括介绍,结果,结论,总结,文献
     class  Report:Document
    {
        
public   override   void  CreatePages()
        {
            pages.Add(
new  IntroductionPage());
            pages.Add(
new  ResultPage());
            pages.Add(
new  ConclusionPage());
            pages.Add(
new  SummaryPage());
            pages.Add(
new  BibliographyPage());
        }
    }    
    
#endregion
    
#region
    
///   <summary>
    
///  客户测试程序
    
///   </summary>
     class  Client
    {
        
static   void  Main()
        {
            Document[] docs 
=   new  Document[ 2 ];
            docs[
0 =   new  Resume();
            docs[
1 =   new  Report();
            
// 显示文档内容
             foreach (Document document  in  docs)
            {
                Console.WriteLine(
" " + document + " ----------- " );
                
foreach (Page page  in  document.Pages)
                {
                    Console.WriteLine(
"    " + page);
                }
            }
            Console.Read();
        }
    }
    
#endregion
}
#endregion

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值