Factory pattern เป็น design pattern ที่จะสร้าง instance ของ class ที่ต้องการ ตามข้อมูลที่กำหนดให้ไป หรือผู้ใช้เป็นผู้เลือกว่าจะ ส้ราง object ใด และ class เหล่านี้ที่ ถูกสร้างขึ้นนั้นมักจะ มี parent ร่วมกัน และก็มี method บางส่วนเหมือนกัน แต่ จะทำงานต่างกันออกไป

โครงสร้างของ Factory pattern

จากโครงสร้าง จะเห็นว่า เราจะมี abstract class ที่ชื่อว่า Product และมี child เป็น ProductB และ ProductA ซึ่งทั้งสอง class นี้ได้ทำการ implement Product แต่เราจะไม่สร้าง object ของทั้งสอง class นี้โดยตรงนะครับ
เราจะสร้าง object ของ สอง class นี้ผ่านทาง CreateProduction(int spec) method ของ ProductFactory class โดยที่ parameter spec นั้นเป็นตัวที่จะบอกกับ Createproduction(int spec) ว่าเราต้องการสร้าง object ของ ProductB หรือ ProductA นั่นเอง เป็นไงครับพอจะเข้าใจไหมครับ

ตัวอย่างของการนำไปใช้กันบ้าง
ตัวอย่างที่เห็นชัดเจน หากเราเคยใช้งาน หรือเคยทดลองใช้ Enterprise Library ของ Microsoft เราจะพบว่า ได้มีการประยุกต์ใช้ factory pattern เช่น ใน Data Access Application Block ของ Enterprise Library.
ใน Data Access Application block นั้นมี class ที่ชื่อว่า Database ( Product class ) ซึ่งเป็น base class ให้กับ SqlDatabase และ OracleDatabase classed ( ProductA, ProductB ) และ factory class ก็คือ CreateDataBase(string name) ( Createproduct(spec))
CreateDatabase method นั้นทำหน้าที่ สร้าง instance ของ Database ชนิดที่ต้องการ ซึ่ง อาจเป็น SqlDatabase หรือ OracleDatabase ขึ้นอยู่กับ ค่าที่ส่งผ่าน parameter ที่ชื่อ name
สิ่งที่เราจะสังเกตเห็นก็คือ ว่า CreateDatabase เป็น static method นะครับ

ตัวอย่างการใช้งาน

interface IPizza
{
    double getPrice();
}

abstract class Pizza : IPizza
{
    public abstract double getPrice();
}

class HamAndMushroomPizza : Pizza {
    override
    public double getPrice() {
        return 8.5;
    }
}

class DeluxePizza : Pizza {
    override
    public double getPrice() {
        return 10.5;
    }
}

class HawaiianPizza : Pizza {
    override
    public double getPrice() {
        return 11.5;
    }
}

class PizzaFactory {
    public enum PizzaType {
        HamMushroom,
        Deluxe,
        Hawaiian
    }

    public static IPizza createPizza(PizzaType pizzaType) {
        switch (pizzaType) {
            case PizzaType.HamMushroom:
                return new HamAndMushroomPizza();
            case PizzaType.Deluxe:
                return new DeluxePizza();
            case PizzaType.Hawaiian:
                return new HawaiianPizza();
        }
        throw new ArgumentException("The pizza type " + pizzaType + " is not recognized.");
    }
}

class PizzaLover {
    public static void Main (string[] args) {

        PizzaFactory.PizzaType[] pizzaTypes = { PizzaFactory.PizzaType.HamMushroom,
                                                PizzaFactory.PizzaType.Deluxe,
                                                PizzaFactory.PizzaType.Hawaiian};
        foreach (PizzaFactory.PizzaType pizzaType in  pizzaTypes) {
            System.Console.WriteLine("Price of " + pizzaType + " is " +
                PizzaFactory.createPizza(pizzaType).getPrice());
        }
    }
}

ครับคงพอได้ concept นะครับ
teerapong sontayaman senior programmer , Soft Speed Solution , s_teerapong2000@yahoo.com