您的位置:首页 > 其它

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

2007-08-31 21:47 501 查看
定义:工厂方法又称工厂模式,也叫虚拟构造器(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

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息