[C# 디자인패턴] Factory Method 패턴
- C#
- 2022. 11. 1. 22:30
참고
UML
- Factory Method 패턴을 표현하기 위한 예제 다이어그램입니다.
클래스 정보
- Product
- 팩토리 메서드가 생성하는 객체의 인터페이스를 정의
- ConcreteProduct
- 제품 인터페이스를 구현
- Creator
- Product 유형의 객체를 반환하는 팩토리 메서드를 선언합니다. Creater 는 기본 ConcreteProduct 객체를 반환하는 팩토리 메서드의 기본 구현을 정의할 수 있습니다.
- Product 객체를 생성하기 위해 팩토리 메서드를 호출할 수 있습니다.
- ConcreteCreator
- 팩토리 메서드를 재정의하여 ConcreteProduct 의 인스턴스를 반환합니다.
Structural code in C#
- 다음 예제 코드는 다양한 객체를 생성할 때 보다 유연한 객체 생성을 제공하는 Factory 방법을 보여줍니다.
- Abstract 클래스는 기본 객체를 제공할 수 있지만 각 하위 클래스를 인스턴스화할 수 있습니다.
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();
}
}
}
실행 결과
Created ConcreteProductA
Created ConcreteProductB
Real-world code in C#
- 다음 예제 코드는 다양한 문서를 생성할 때 유연성을 제공하는 Factory 메서드를 보여줍니다.
- 파생된 Document 클래스 Report 및 Resume은 Document 클래스의 확장 버전을 인스턴스화합니다.
- 여기에서 Factory 메서드는 Document 기본 클래스의 생성자에서 호출됩니다.
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());
}
}
}
실행 결과
Resume -------
SkillsPage
EducationPage
ExperiencePage
Report -------
IntroductionPage
ResultsPage
ConclusionPage
요약 Page
BibliographyPage
728x90
'C#' 카테고리의 다른 글
[C# .NET Core] EFCore PostgreSQL CodeFirst 예제 (0) | 2022.11.29 |
---|---|
[.NET EFCore] EFCore Postgresql Database First 예시 (0) | 2022.11.26 |
[C# 디자인 패턴] 재귀 제네릭을 사용한 Fluent Builder 패턴 (0) | 2022.10.31 |
[C# 디자인 패턴] 빌더 디자인 패턴 및 Fluent Builder (0) | 2022.10.28 |
[C#] 분산 추적 이란? (0) | 2022.07.29 |
이 글을 공유하기