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

本文介绍了工厂方法模式的概念及其在多文档系统中的应用案例。通过具体的代码示例展示了如何使用该模式来创建不同类型的文档,例如个人简历和报告,并讨论了其优点和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:工厂方法又称工厂模式,也叫虚拟构造器(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、付费专栏及课程。

余额充值