ความแตกต่างระหว่างรูปแบบโรงงานและโรงงานแบบนามธรรมคืออะไร


40

ในที่สุดเมื่อเริ่มพยายามอย่างจริงจังที่จะเรียนรู้รูปแบบพื้นฐานบางอย่าง (ช้ามากในอาชีพการงาน แต่นั่นเป็นเรื่องที่แตกต่างกัน) ฉันพยายามที่จะหาความแตกต่างระหว่างรูปแบบโรงงานและโรงงานนามธรรม

อะไรคือความแตกต่างที่สำคัญระหว่างสองรูปแบบนี้?

ฉันเข้าใจว่าวิธีการจากโรงงานสร้างวัตถุผ่านการสืบทอดและ Abstract Factory ทำผ่านการจัดวางวัตถุ แต่จากมุมมองที่ใช้งานได้จริงฉันยังคงมีปัญหาในการมองเห็นภาพว่าแต่ละคนทำงานอย่างไร



2
เพื่ออธิบายให้ชัดเจนคุณหมายถึง "Factory Method" เมื่อคุณพูดว่า "Factory Pattern" หรือไม่? หากคุณกำลังพูดถึงรูปแบบ Gang of Four ไม่มีรูปแบบของโรงงาน แต่มีบทคัดย่อจากโรงงานและวิธีการของโรงงาน
โธมัสโอเวนส์

ใช่ - วิธีการโรงงาน
Phil.Wheeler

3
เพื่อความเป็นธรรมวลีสองวลีนั้นดูเหมือนจะเป็นเรื่องปกติ
Phil.Wheeler

1
อ่าวิธีโรงงาน วิธีแก้ปัญหาสำหรับข้อเท็จจริงที่newไม่ใช่วิธีการ (ในบางระบบที่ยอมรับกันทั่วไป - ระบบวัตถุ)
Donal Fellows

คำตอบ:


44

โดยทั่วไปแล้ววิธีการของโรงงานจะถูกจัดประเภทตามคำสั่งสลับที่แต่ละกรณีส่งคืนคลาสที่ต่างกันโดยใช้รูทอินเทอร์เฟซเดียวกันเพื่อให้รหัสการโทรไม่จำเป็นต้องตัดสินใจเกี่ยวกับการนำไปใช้

นึกถึงโรงงานตรวจสอบบัตรเครดิตที่ส่งคืนเครื่องมือตรวจสอบที่แตกต่างกันสำหรับบัตรแต่ละประเภท

public ICardValidator GetCardValidator (string cardType)
{
    switch (cardType.ToLower())
    {
        case "visa":
            return new VisaCardValidator();
        case "mastercard":
        case "ecmc":
            return new MastercardValidator();
        default:
            throw new CreditCardTypeException("Do not recognise this type");
    }
}

โรงงานบทคัดย่อเป็นที่ที่คุณต้องเรียนโรงงานคอนกรีตหลาย ๆ (ไม่ได้โรงงานวิธีการ) ที่ได้มาจากอินเตอร์เฟซที่หนึ่งซึ่งอาจจะกลับมาชนิดที่แตกต่างจากวิธีการที่แตกต่างกัน

ลองนึกถึงตัวจัดการเกมหมากรุกที่มีคลาสที่แตกต่างกันสำหรับกฎชุดต่างๆแต่ละชุด

public class StandardChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class HexagonalChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new HexagonalChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new HexagonalChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class SpeedChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new SpeedChessMoveClock();
    }
}

Abstract Factory ซึ่งคล้ายกับกลยุทธ์มักถูกเลือกโดยใช้วิธีการของโรงงาน แต่ไม่จำเป็นต้องรวมเข้าด้วยกันจึงเป็นรูปแบบของตัวเอง


3
คำอธิบายเกี่ยวกับวิธีการของโรงงานนั้นถูกต้องหรือไม่ สิ่งที่เกี่ยวกับ "รูปแบบวิธีการของโรงงานอาศัยการสืบทอดเนื่องจากการสร้างวัตถุได้รับการมอบหมายให้กับคลาสย่อยที่ใช้วิธีการจากโรงงานเพื่อสร้างวัตถุ" ดังนั้นตัวอย่างจึงคล้ายกับ Static Factory
SerG

@SerG ในความเป็นธรรมคุณได้รับการอ้างอิงจาก Wikipedia บนหน้าเว็บที่อ่านแตกต่างกันมากเมื่อสามปีก่อน ฉันจะยืนยันว่าหน้า Wikipedia ปัจจุบันขัดแย้งกับตัวเองในหลาย ๆ ที่ แต่ฉันไม่ต้องการมีส่วนร่วมในการเลือกสิ่งนั้น สิ่งที่ฉันจะยอมรับในความเข้าใจย้อนหลังคือตัวอย่างที่ฉันให้ไว้ที่นี่เป็นวิธีการเฉพาะของโรงงานที่เรียกว่าวิธีการแบบ Parameterized Factory แต่ประเด็นเกี่ยวกับความแตกต่างระหว่างวิธีการของโรงงานและโรงงานที่เป็นนามธรรมถือเป็นวิธีการของโรงงานทุกประเภท
pdr

2
ข้อความเดียวกันกับคำพูดของฉันมีอยู่ใน GoF "Design Patterns" และ Parameterized FM ก็อธิบายไว้เช่นกัน
SerG

ส่วนที่สำคัญคือโรงงานจะให้วัตถุที่เหมาะสมแก่ผู้โทรขึ้นอยู่กับสถานการณ์เฉพาะและผู้โทรไม่จำเป็นต้องรู้ว่าคลาสของวัตถุนั้นเป็นอย่างไรและไม่จำเป็นต้องรู้ว่าวัตถุนั้น ๆ ถูกเลือกตราบใดที่วัตถุสนับสนุนอินเทอร์เฟซที่ผู้โทรทราบ
gnasher729

คุณควรระบุไว้อย่างชัดเจนในคำตอบของคุณว่าตัวอย่างของคุณไม่ใช่รูปแบบวิธีการของโรงงานทั่วไป แต่มีความเชี่ยวชาญเฉพาะบางอย่างที่มีชื่อว่าวิธีการแบบกำหนดพารามิเตอร์จากโรงงาน และเขียนเกี่ยวกับคำจำกัดความของวิธีการของโรงงานทั่วไปเพราะมันเป็นความเข้าใจผิดในขณะนี้ ฉันเพิ่งเรียนรู้เกี่ยวกับรูปแบบวิธีการของโรงงานฉันเข้าใจทุกอย่างและจากนั้นฉันอ่านคำตอบที่แสดงรูปแบบวิธีการของโรงงานเป็นสิ่งที่แตกต่างและฉันก็สับสน ไม่มีข้อมูลเกี่ยวกับตัวอย่างนั้นไม่ใช่รูปแบบวิธีการทั่วไปจากโรงงาน ขอบคุณ SerG สำหรับการชี้ให้เห็นในความคิดเห็น
ctomek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.