คุณจำความแตกต่างระหว่างรูปแบบนามธรรมจากโรงงานและรูปแบบวิธีการของโรงงานในรูปแบบการออกแบบได้อย่างไร


ตอบ 1:

รูปแบบการออกแบบโรงงาน:

  • มันอยู่ภายใต้ Creational Design Pattern รูปแบบโรงงานบอกว่าการสร้างวัตถุจะถูกจัดการโดยคลาสอื่นโดยใช้ประเภทอินพุต

ข้อดี:

  • มันช่วยให้ข้อต่อหลวม

ควรใช้รูปแบบการออกแบบจากโรงงานเมื่อใด

  • รูปแบบการออกแบบจากโรงงานจะใช้เมื่อเรามีซูเปอร์คลาสที่มีหลายคลาสย่อยและขึ้นอยู่กับอินพุตเราต้องส่งคืนหนึ่งในคลาสย่อยตัวอย่าง: หากร้านอาหารให้บริการอาหาร Veg, Non-Veg และอาหารอิตาเลี่ยน รักษา VegFood, NonVegFood และ ItalianFood เป็นสามคลาสที่มี superclass คือ Food หากลูกค้าถามว่า "Veg" วิธีการของโรงงานจะส่งคืนคลาส "VegFood"

ตัวอย่าง:

ขั้นตอนที่ 1: สร้างคลาสนามธรรม "อาหาร" ซึ่งมีตัวแปรสองตัวที่เรียกว่า "billPerPerson" และ "รายการ"

 อาหารชั้นนามธรรมสาธารณะ

{
    ป้องกัน billPerPerson คู่;
    ชุดป้องกันรายการ;

    อาหารสาธารณะ (double billPerPerson)

    {
        this.billPerPerson = billPerPerson;
        this.items = new HashSet <> ();
    }

    getBill สาธารณะสองครั้ง ()

    {
        คืนบิล

    }

    ชุดสาธารณะ getItems ()
    {
        ส่งคืนรายการ;
    }
}

ขั้นตอนที่ 2: สร้างคลาสคอนกรีตที่ขยายคลาสนามธรรม "อาหาร"

คลาส VegFood สาธารณะขยายอาหาร
{
    VegFood สาธารณะ ()

    {
        ซุปเปอร์ (100);
        Items.Add ( "เกียจคร้าน");
        Items.Add ( "Dosa");
        Items.Add ( "Vada");
    }
}

NonVegFood ระดับสาธารณะขยายอาหาร
{
    NonVegFood สาธารณะ ()
    {
        ซุปเปอร์ (120);
        Items.Add ( "Biriyani");
        items.add ("ไก่ 65");
    }
}

ขั้นตอนที่ 3: สร้าง FoodServer ซึ่งเป็นคลาส Factory เพื่อสร้างวัตถุสำหรับคอนกรีตตามข้อมูล:

FoodServer ระดับสาธารณะ

{
    public static Food getFood (ประเภทอาหารของสตริง)

    {
        if (foodType.equals ("veg"))
        {
            ส่งคืน VegFood ใหม่ ();
        }
        ถ้าอื่น (foodType.equals ("ไม่ใช่ veg"))
        {
            ส่งคืน NonVegFood ใหม่ ();
        }
        อื่น
        {
            System.out.println ("เราไม่ได้ให้บริการ" + foodType);
            ส่งคืน null
        }
    }
}

ขั้นตอนที่ 4: "ลูกค้า" ระดับหลักเพื่อรับอาหารที่ต้องการตามประเภทอาหาร

ลูกค้าระดับสาธารณะ
{
    โมฆะคงที่สาธารณะหลัก (String [] args)
    {
        ลูกค้า food1Food = FoodServer.getFood ("veg");
        System.out.println ( "Customer1");
        System.out.println ("รายการ:" + customer1Food.getItems (). toString ());
        System.out.println ("Bill:" + customer1Food.getBill ());
        ลูกค้า food2Food = FoodServer.getFood ("ไม่ใช่ veg");
        System.out.println ( "Customer1");
        System.out.println ("รายการ:" + customer2Food.getItems (). toString ());
        System.out.println ("Bill:" + customer2Food.getBill ());
    }
}

รูปแบบการออกแบบโรงงานนามธรรม:

  • มันอยู่ภายใต้ Creational Design Pattern มันมีส่วนต่อประสานสำหรับการสร้างครอบครัวของวัตถุที่เกี่ยวข้องหรือขึ้นอยู่กับโดยไม่ต้องระบุชั้นคอนกรีตของพวกเขารูปแบบโรงงานกวางเป็นโรงงานสุดยอดที่จะคืนโรงงานที่ดีที่สุดตามอินพุตมันทำหน้าที่เป็นโรงงานของโรงงาน . มันทำให้ลูกค้าไม่สามารถรู้ได้ว่าโรงงานใดจะถูกส่งคืน

ตัวอย่างชีวิตจริง:

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

เมื่อใดควรใช้รูปแบบการออกแบบจากโรงงานบทคัดย่อ?

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

หมายเหตุ: มันอาจจะสับสนดังนั้นโปรดระวังวิดีโอที่ฉันฝังไว้ท้ายหน้านี้

ตัวอย่าง:

ขั้นตอนที่ 1:

  • สร้างส่วนต่อประสานที่เรียกว่า "หลักสูตร"
หลักสูตรอินเตอร์เฟซสาธารณะ
{
    ประชาชน String getCourseName ();
}

ขั้นตอนที่ 2:

  • สร้างคลาสที่เป็นรูปธรรมซึ่งใช้อินเตอร์เฟส "หลักสูตร"
ProgrammingCourse ชั้นเรียนสาธารณะใช้หลักสูตร
{
    @แทนที่
    ประชาชนสตริง getCourseName ()
    {
       ส่งคืน "Java";
    }
}

NonProgrammingCourse ระดับสาธารณะใช้หลักสูตร
{
    @แทนที่
    ประชาชนสตริง getCourseName ()
    {
        ส่งคืน "DSP";
    }
}

ขั้นที่ 3:

  • สร้างส่วนต่อประสานที่เรียกว่า "แหล่งที่มา"
อินเตอร์เฟซสาธารณะที่มา
{
    String สาธารณะ getSourceName ();
}

ขั้นที่ 4:

  • สร้างคลาสรูปธรรมที่ใช้อินเทอร์เฟซ "แหล่งที่มา"
ออฟไลน์ระดับสาธารณะใช้แหล่งที่มา
{
    @แทนที่
    ประชาชนสตริง getSourceName ()
    {
        ส่งคืน "หนังสือ";
    }
}

คลาสสาธารณะออนไลน์ใช้แหล่งที่มา
{
    @แทนที่
    ประชาชนสตริง getSourceName ()
    {
        ส่งคืน "YouTube";
    }
}

ขั้นตอนที่ 5:

  • สร้างคลาสนามธรรม "SourceCourseFactory"
คลาสนามธรรมสาธารณะ SourceCourseFactory
{
    Public abstract Source getSource (String sourceType);
    
    public abstract Course getCourse (String courseType);
}

ขั้นตอนที่ 6:

  • สร้างคลาสโรงงาน "CourseFactory" ที่ขยาย "SourceCourseFactory"
คลาสสาธารณะ CourseFactory ขยาย SourceCourseFactory
{
    @แทนที่
    public source getSource (String sourceType)
    {
        ส่งคืน null
    }

    @แทนที่
    หลักสูตรสาธารณะ getCourse (ประเภทสตริง String)
    {
        ถ้า (courseType.equalsIgnoreCase ( "โปรแกรม"))
        {
            ส่งคืน ProgrammingCourse ใหม่ ();
        }
        อื่นถ้า (courseType.equalsIgnoreCase ("ไม่ใช่โปรแกรม")
        {
            ส่งคืน NonProgrammingCourse ใหม่ ();
        }
        อื่น
        {
            ส่งคืน null
        }
    }
}

ขั้นตอนที่ 7:

  • สร้างคลาสโรงงาน "SourceFactory" ที่ขยาย "SourceCourseFactory"
คลาสสาธารณะ SourceFactory ขยาย SourceCourseFactory
{

    @แทนที่
    public source getSource (String sourceType)
    {
        ถ้า (sourceType.equalsIgnoreCase ( "ออนไลน์"))
        {
            ส่งคืนออนไลน์ใหม่ ();
        }
        อื่นถ้า (sourceType.equalsIgnoreCase ("ออฟไลน์"))
        {
            ส่งคืนออฟไลน์ใหม่ ();
        }
        อื่น
        {
            ส่งคืน null
        }
    }

    @แทนที่
    หลักสูตรสาธารณะ getCourse (ประเภทสตริง String)
    {
       ส่งคืน null
    }
    
}

ขั้นตอนที่ 8:

  • สร้างคลาสหลักที่เรียกคลาส Abstract Factory เพื่อรับออบเจ็กต์คลาส Factory จริงจากนั้นจะใช้อ็อบเจกต์นั้นสำหรับการดำเนินการอื่น ๆ
 คลาสสาธารณะ ExampleMain
{
    โมฆะคงที่สาธารณะหลัก (String [] args)
    {
        หลักสูตร SourceCourseFactory = FactoryCreator.getSourceCourseFactory ("หลักสูตร");

        System.out.println (course.getCourse ( "โปรแกรม") getCourseName ().);

        SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("แหล่งที่มา");
        System.out.println (source.getSource ( "ออนไลน์") getSourceName ().);

    }
}