1. Factory Method Pattern là gì?
Factory Method Pattern hay gọi ngắn gọn là Factory Method là một trong những Pattern thuộc nhóm khởi tạo (Creational Pattern). Nhiệm vụ của Factory Pattern là quản lý và trả về các đối tượng theo yêu cầu, giúp cho việc khởi tạo đổi tượng một cách linh hoạt hơn.
Factory Pattern đúng nghĩa là một nhà máy, và nhà máy này sẽ “sản xuất” các đối tượng theo yêu cầu của chúng ta.
2. Cấu trúc

3. Sử dụng Factory Method khi nào?
- Chúng ta có một super class với nhiều class con và dựa trên đầu vào, chúng ta cần trả về một class con. Mô hình này giúp chúng ta đưa trách nhiệm của việc khởi tạo một lớp từ phía người dùng (client) sang lớp Factory.
- Chúng ta không biết sau này sẽ cần đến những lớp con nào nữa. Khi cần mở rộng, hãy tạo ra sub class và implement thêm vào factory method cho việc khởi tạo sub class này.
4. Cách triển khai và code ví dụ
using System;
namespace DesignPatternFactory
{
// Sub class - chúng ta không khởi tạo trực tiếp các class này
class DeluxePizza : Pizza
{
private decimal price = 10.5M;
public override decimal GetPrice() { return price; }
}
// Sub class - chúng ta không khởi tạo trực tiếp các class này
public class HamAndMushroomPizza : Pizza
{
private decimal price = 8.5M;
public override decimal GetPrice() { return price; }
}
// Sub class - chúng ta không khởi tạo trực tiếp các class này
class SeafoodPizza : Pizza
{
private decimal price = 11.5M;
public override decimal GetPrice() { return price; }
}
// Class đóng vai trò là Factory Class
// Chúng ta khởi tạo các Sub-class thông qua class này
public abstract class Pizza
{
public abstract decimal GetPrice();
public enum PizzaType
{
HamMushroom, Deluxe, Seafood
}
public static Pizza PizzaFactory(PizzaType pizzaType)
{
switch (pizzaType)
{
case PizzaType.HamMushroom:
return new HamAndMushroomPizza();
case PizzaType.Deluxe:
return new DeluxePizza();
case PizzaType.Seafood:
return new SeafoodPizza();
}
throw new System.NotSupportedException
(
"The pizza type " + pizzaType.ToString() + " is not recognized."
);
}
}
class Program
{
static void Main(string[] args)
{
// Đưa vào tham số đầu vào để khởi tạo Sub class mong muốn
Console.WriteLine
(
Pizza.PizzaFactory(Pizza.PizzaType.Seafood).GetPrice().ToString("C2")
); // $11.50
Console.ReadLine();
}
}
}