工厂方法模式

本文介绍了工厂方法模式的基本概念,通过示例代码展示了如何使用此模式来实现对象的创建过程延迟到子类。提供了结构化示例及现实世界应用案例,包括不同类型的创建者和产品类。
部署运行你感兴趣的模型镜像

1.       定义

           定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

2.      UML 类图

 

3.      结构代码

// Factory Method pattern -- Structural example

using System;

 

namespace DoFactory.GangOfFour.Factory.Structural

{

  /// <summary>

  /// MainApp startup class for Structural

  /// Factory Method Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      // An array of creators

      Creator[] creators = new Creator[2];

 

      creators[0] = new ConcreteCreatorA();

      creators[1] = new ConcreteCreatorB();

 

      // Iterate over creators and create products

      foreach (Creator creator in creators)

      {

        Product product = creator.FactoryMethod();

        Console.WriteLine("Created {0}",

          product.GetType().Name);

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Product' abstract class

  /// </summary>

  abstract class Product

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConcreteProductA : Product

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConcreteProductB : Product

  {

  }

 

  /// <summary>

  /// The 'Creator' abstract class

  /// </summary>

  abstract class Creator

  {

    public abstract Product FactoryMethod();

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class ConcreteCreatorA : Creator

  {

    public override Product FactoryMethod()

    {

      return new ConcreteProductA();

    }

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class ConcreteCreatorB : Creator

  {

    public override Product FactoryMethod()

    {

      return new ConcreteProductB();

    }

  }

}


Output
Created ConcreteProductA
Created ConcreteProductB




4.      实例代码

// Factory Method pattern -- Real World example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Factory.RealWorld

{

  /// <summary>

  /// MainApp startup class for Real-World

  /// Factory Method Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      // 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)

      {

        Console.WriteLine("\n" + document.GetType().Name + "--");

        foreach (Page page in document.Pages)

        {

          Console.WriteLine(" " + page.GetType().Name);

        }

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Product' abstract class

  /// </summary>

  abstract class Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class SkillsPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class EducationPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ExperiencePage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class IntroductionPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ResultsPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConclusionPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class SummaryPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class BibliographyPage : Page

  {

  }

 

  /// <summary>

  /// The 'Creator' abstract class

  /// </summary>

  abstract class Document

  {

    private List<Page> _pages = new List<Page>();

 

    // Constructor calls abstract Factory method

    public Document()

    {

      this.CreatePages();

    }

 

    public List<Page> Pages

    {

      get { return _pages; }

    }

 

    // Factory Method

    public abstract void CreatePages();

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class Resume : Document

  {

    // Factory Method implementation

    public override void CreatePages()

    {

      Pages.Add(new SkillsPage());

      Pages.Add(new EducationPage());

      Pages.Add(new ExperiencePage());

    }

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  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());

    }

  }

}


Output
Resume -------
 SkillsPage
 EducationPage
 ExperiencePage

Report -------
 IntroductionPage
 ResultsPage
 ConclusionPage
 SummaryPage
 BibliographyPage


该文章来自:http://www.dofactory.com/Patterns/PatternFactory.aspx

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值