工厂方法模式
来源:互联网 发布:数据分析报告格式范文 编辑:程序博客网 时间:2024/05/11 20:34
1. 定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
2. UML 类图
3. 结构代码
using System;
namespace DoFactory.GangOfFour.Factory.Structural
{
///<summary>
/// MainApp startup class for Structural
/// Factory Method Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
staticvoid 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 creatorin creators)
{
Product product = creator.FactoryMethod();
Console.WriteLine("Created {0}",
product.GetType().Name);
}
// Wait for user
Console.ReadKey();
}
}
///<summary>
/// The 'Product' abstract class
///</summary>
abstractclass Product
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classConcreteProductA : Product
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classConcreteProductB : Product
{
}
///<summary>
/// The 'Creator' abstract class
///</summary>
abstractclass Creator
{
publicabstract Product FactoryMethod();
}
///<summary>
/// A 'ConcreteCreator' class
///</summary>
classConcreteCreatorA : Creator
{
publicoverride Product FactoryMethod()
{
returnnew ConcreteProductA();
}
}
///<summary>
/// A 'ConcreteCreator' class
///</summary>
classConcreteCreatorB : Creator
{
publicoverride Product FactoryMethod()
{
returnnew ConcreteProductB();
}
}
}
Output
Created ConcreteProductB
4. 实例代码
using System;
using System.Collections.Generic;
namespace DoFactory.GangOfFour.Factory.RealWorld
{
///<summary>
/// MainApp startup class for Real-World
/// Factory Method Design Pattern.
///</summary>
classMainApp
{
///<summary>
/// Entry point into console application.
///</summary>
staticvoid Main()
{
// Note: constructors call Factory Method
Document[] documents =new Document[2];
documents[0] = new Resume();
documents[1] = new Report();
// Display document pages
foreach (Document documentin documents)
{
Console.WriteLine("\n" + document.GetType().Name +"--");
foreach (Page pagein document.Pages)
{
Console.WriteLine(" " + page.GetType().Name);
}
}
// Wait for user
Console.ReadKey();
}
}
///<summary>
/// The 'Product' abstract class
///</summary>
abstractclass Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classSkillsPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classEducationPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classExperiencePage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classIntroductionPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classResultsPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classConclusionPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classSummaryPage : Page
{
}
///<summary>
/// A 'ConcreteProduct' class
///</summary>
classBibliographyPage : Page
{
}
///<summary>
/// The 'Creator' abstract class
///</summary>
abstractclass Document
{
privateList<Page> _pages =new List<Page>();
// Constructor calls abstract Factory method
public Document()
{
this.CreatePages();
}
publicList<Page> Pages
{
get {return _pages; }
}
// Factory Method
publicabstract void CreatePages();
}
///<summary>
/// A 'ConcreteCreator' class
///</summary>
classResume : Document
{
// Factory Method implementation
publicoverride void CreatePages()
{
Pages.Add(newSkillsPage());
Pages.Add(newEducationPage());
Pages.Add(newExperiencePage());
}
}
///<summary>
/// A 'ConcreteCreator' class
///</summary>
classReport : Document
{
// Factory Method implementation
publicoverride void CreatePages()
{
Pages.Add(newIntroductionPage());
Pages.Add(newResultsPage());
Pages.Add(newConclusionPage());
Pages.Add(newSummaryPage());
Pages.Add(newBibliographyPage());
}
}
}
Output
SkillsPage
EducationPage
ExperiencePage
Report -------
IntroductionPage
ResultsPage
ConclusionPage
SummaryPage
BibliographyPage
该文章来自:http://www.dofactory.com/Patterns/PatternFactory.aspx
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- Android学习札记44:解读APK反编译后得到的布局文件
- DOS命令
- jsp中的referer
- 固定搭配
- teradata查看执行计划
- 工厂方法模式
- 一个有用的博客
- Akka2使用探索3(Duration 和 Deadline)
- 再探Android多应用间数据共享机制,自定义ContentProvider
- spring mvc系列文章 - springmvc spring mybatis ibatis freemark整合开发(2.0版:基于注解)
- 兼容IE8 错位 背景不显示 DIV失效
- OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
- MFC上下浮动与渐入渐出消息提示框实现
- EaglePHP 2.0更新日志