⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factorymethodrealworld.cs

📁 使用C#程序将23个常用设计模式进行列表显示
💻 CS
字号:
using System;
using System.Windows.Forms;
using System.Collections;

//工厂方法模式(FactoryMethod)
//意图
//    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
//适用性
//    1.当一个类不知道它所必须创建的对象的类的时候。
//    2.当一个类希望由它的子类来指定它所创建的对象的时候。
//    3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

/************************************************************************
* 适用场景:
*   一、为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。
*   这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。当需要创建子类时出现问题:
*     1.客户程序员必须知道实际子类的名称;
*     2.程序的扩展性和维护变得越来越困难;
*   二、在父类中并不知道具体要实例化哪一个具体的子类;
*
* Factory模式的两个最重要的功能:
*   1. 定义创建对象的接口,封装了对象的创建 -- 声明一个创建对象的接口,并封装了对象的创建过程;
*   2. 使得具体化类的工作延迟到了子类中 -- 提供一个对象创建对象的接口,并在子类中提供其具体实现;
*     
* 例如:
*     语义分析过程中,要为文法中的每个非终结符构造一个类处理,因此这个过程中对象的创建非常多,
*     采用Factory模式后系统可读性性和维护都变得容易许多。
* 问题:
*   1. 如果为每一个具体的 ConcreteProduct 类的实例化提供一个函数体,那么我们可能不得不在系统中添加
*      一个方法来处理这个新建的ConcreteProduct,这样Factory的接口永远就不肯能封闭(Close)。
*      当然我们可以通过创建一个Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。
*   2. 在实现中我们可以通过参数化工厂方法,即给FactoryMethod()传递一个参数(如模版)用以决定是创建具体哪一个具体的Product。
* 注意:
*   Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),
*   如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。
* 
************************************************************************/

namespace DesignPattern.FactoryMethodRealWorld
{
    class FactoryMethodRealWorld : AbstractPattern
    {
        public static void Run(TextBox tbInfo)
        {
            s_tbInfo = tbInfo;
            s_tbInfo.Text = "";

            // Note: constructors call Factory Method 
            Document[] documents = new Document[2]; 
            documents[0] = new Resume(); 
            documents[1] = new Report(); 
            
            // Display document pages 
            foreach (Document document in documents) 
            {
                DesignPattern.FormMain.OutputInfo("\n" + document.GetType().Name+ "--"); 
                foreach (Page page in document.Pages) 
                { 
                    DesignPattern.FormMain.OutputInfo(" " + page.GetType().Name); 
                }
            }

            // Wait for user 
            //Console.Read(); 
        }
    }
    // "Product" 
    abstract class Page { } 
    
    // "ConcreteProduct" 
    class SkillsPage : Page { }
    
    // "ConcreteProduct" 
    class EducationPage : Page { } 
    
    // "ConcreteProduct" 
    class ExperiencePage : Page { }
    
    // "ConcreteProduct" 
    class IntroductionPage : Page { } 
    
    // "ConcreteProduct" 
    class ResultsPage : Page { } 
    
    // "ConcreteProduct"
    class ConclusionPage : Page { } 
    
    // "ConcreteProduct" 
    class SummaryPage : Page { } 
    
    // "ConcreteProduct" 
    class BibliographyPage : Page { } 
    
    // "Creator" 
    abstract class Document 
    {
        private ArrayList pages = new ArrayList(); 
        // Constructor calls abstract Factory method 
        public Document() 
        {
            this.CreatePages(); 
        }
        public ArrayList Pages 
        {
            get
            {
                return pages; 
            }
        }
        
        // Factory Method 
        public abstract void CreatePages(); 
    } 
    
    // "ConcreteCreator" 
    class Resume : Document 
    {
        // Factory Method implementation 
        public override void CreatePages() 
        {
            Pages.Add(new SkillsPage()); 
            Pages.Add(new EducationPage()); 
            Pages.Add(new ExperiencePage());
        }
    } 
    
    // "ConcreteCreator" 
    class Report : Document 
    {
        // Factory Method implementation 
        public override void CreatePages() 
        {
            Pages.Add(new IntroductionPage()); 
            Pages.Add(new ResultsPage()); 
            Pages.Add(new ConclusionPage()); 
            Pages.Add(new SummaryPage()); 
            Pages.Add(new BibliographyPage()); 
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -