Làm thế nào để bạn nhớ sự khác biệt giữa mẫu Tóm tắt Factory và mẫu Phương thức nhà máy trong các mẫu thiết kế?


Câu trả lời 1:

Mẫu thiết kế nhà máy:

  • Nó nằm trong Mẫu thiết kế sáng tạo. Mẫu mô tả cho biết việc tạo đối tượng sẽ được xử lý bởi một lớp khác bằng cách sử dụng kiểu đầu vào.

Ưu điểm:

  • Nó cho phép khớp nối lỏng lẻo.

Khi nào nên sử dụng mẫu thiết kế nhà máy?

  • Mẫu thiết kế nhà máy được sử dụng khi chúng ta có một siêu lớp có nhiều lớp con và dựa trên đầu vào, chúng ta cần trả về một trong các lớp con. Ví dụ: Nếu một Nhà hàng phục vụ thực phẩm chay, thực phẩm không chay và thực phẩm Ý. Hãy coi VegFood, NonVegFood và ItalianFood là ba lớp có siêu lớp là Thực phẩm. Nếu khách hàng hỏi "Veg" thì phương thức Factory sẽ trả về lớp "VegFood".

Thí dụ:

Bước 1: Tạo một lớp trừu tượng "Thực phẩm" có hai biến được gọi là "billPerPerson" và "các mặt hàng".

 lớp trừu tượng công cộng thực phẩm

{
    bảo vệ gấp đôi billPerPerson;
    mục được bảo vệ;

    Thực phẩm công cộng (gấp đôi billPerPerson)

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

    công khai gấp đôi getBill ()

    {
        trả lại billPerPerson;

    }

    công khai Đặt getItems ()
    {
        trả lại hàng;
    }
}

Bước 2: Tạo các lớp cụ thể mở rộng lớp trừu tượng "Thực phẩm"

lớp học công cộng VegFood mở rộng thực phẩm
{
    VegFood công cộng ()

    {
        siêu (100);
        mục.add ("Idly");
        mục.add ("Dosa");
        mục.add ("Vada");
    }
}

lớp học công cộng NonVegFood mở rộng thực phẩm
{
    công cộng NonVegFood ()
    {
        siêu (120);
        mục.add ("Biriyani");
        mục.add ("Gà 65");
    }
}

Bước 3: Tạo FoodServer là lớp Factory để tạo đối tượng cụ thể dựa trên thông tin:

lớp công cộng FoodServer

{
    Thực phẩm tĩnh công khai getFood (String foodType)

    {
        if (foodType.equals ("veg"))
        {
            trả lại VegFood mới ();
        }
        khác if (foodType.equals ("non veg"))
        {
            trả lại NonVegFood mới ();
        }
        khác
        {
            System.out.println ("Chúng tôi không phục vụ" + foodType);
            trả về null;
        }
    }
}

Bước 4: Lớp chính "Khách hàng" để nhận Thực phẩm cần thiết dựa trên loại thực phẩm.

lớp khách hàng
{
    public static void main (String [] args)
    {
        Thực phẩm khách hàng1Food = FoodServer.getFood ("veg");
        System.out.println ("Khách hàng1");
        System.out.println ("Mục:" + customer1Food.getItems (). ToString ());
        System.out.println ("Hóa đơn:" + customer1Food.getBill ());
        Thực phẩm khách hàng2Food = FoodServer.getFood ("không thuần chay");
        System.out.println ("Khách hàng1");
        System.out.println ("Mục:" + customer2Food.getItems (). ToString ());
        System.out.println ("Hóa đơn:" + customer2Food.getBill ());
    }
}

Mẫu thiết kế nhà máy trừu tượng:

  • Nó nằm trong Mẫu thiết kế sáng tạo. Nó cung cấp giao diện để tạo các họ của các đối tượng liên quan hoặc phụ thuộc mà không chỉ định các lớp cụ thể của chúng. Các mẫu nhà máy là một siêu nhà máy sẽ trả lại Nhà máy tốt nhất dựa trên đầu vào. Nó hoạt động như một nhà máy của các nhà máy . Nó trừu tượng cho khách hàng biết nhà máy nào sẽ được trả lại.

Ví dụ thực tế:

  • Hãy xem xét một nhà máy lớn sản xuất xà phòng. Nhà máy đó sẽ không sản xuất tất cả những thứ cần thiết cho xà phòng. Nó sẽ có nhiều nhà máy phụ sản xuất "thanh xà phòng", "bọc xà phòng", v.v. Mọi thứ sẽ được lắp ráp bởi nhà máy chính.

Khi nào nên sử dụng Mẫu thiết kế nhà máy trừu tượng?

  • Máy khách phải độc lập với cách tạo đối tượng và đối tượng lớp nào được tạo. Điều này hữu ích khi đối tượng cần được tạo từ một nhóm các lớp.

LƯU Ý: Nó có thể gây nhầm lẫn vì vậy vui lòng xem các video mà tôi đã nhúng ở cuối trang này.

Thí dụ:

Bước 1:

  • Tạo một giao diện gọi là "Khóa học".
khóa học giao diện công cộng
{
    chuỗi công khai getC thuyếtName ();
}

Bước 2:

  • Tạo các lớp cụ thể thực hiện Giao diện "Khóa học".
Lập trình lớp học công cộng Thực hiện khóa học
{
    @Ghi đè
    chuỗi công khai getC thuyếtName ()
    {
       trả về "Java";
    }
}

lớp học công cộng NonProgrammingC thảo thực hiện khóa học
{
    @Ghi đè
    chuỗi công khai getC thuyếtName ()
    {
        trả lại "DSP";
    }
}

Bước 3:

  • Tạo một Giao diện gọi là "Nguồn".
giao diện công cộng Nguồn
{
    chuỗi công khai getSourceName ();
}

Bước 4:

  • Tạo các lớp cụ thể thực hiện Giao diện "Nguồn".
lớp công khai Ngoại tuyến thực hiện Nguồn
{
    @Ghi đè
    chuỗi công khai getSourceName ()
    {
        trả lại "Sách";
    }
}

lớp công khai Thực hiện trực tuyến Nguồn
{
    @Ghi đè
    chuỗi công khai getSourceName ()
    {
        trả lại "YouTube";
    }
}

Bước 5:

  • Tạo một lớp trừu tượng "SourceC thuyếtFactory".
lớp trừu tượng công cộng SourceC thuyếtFactory
{
    nguồn trừu tượng công khai getSource (String sourceType);
    
    khóa học trừu tượng công khai getC thảo (String CourseType);
}

Bước 6:

  • Tạo một lớp Factory "CourseFactory" mở rộng "SourceC thuyếtFactory"
Lớp học công cộng Khóa học mở rộng SourceC thuyếtFactory
{
    @Ghi đè
    nguồn công khai getSource (String sourceType)
    {
        trả về null;
    }

    @Ghi đè
    khóa học công khai getC thảo (String CourseType)
    {
        if (CourseType.equalsIgnoreCase ("lập trình"))
        {
            trả về Lập trình mới ();
        }
        khác if (CourseType.equalsIgnoreCase ("không lập trình"))
        {
            trả về NonProgrammingCourse ();
        }
        khác
        {
            trả về null;
        }
    }
}

Bước 7:

  • Tạo một lớp Factory "SourceFactory" mở rộng "SourceC thuyếtFactory"
lớp công khai SourceFactory mở rộng SourceC thuyếtFactory
{

    @Ghi đè
    nguồn công khai getSource (String sourceType)
    {
        if (sourceType.equalsIgnoreCase ("trực tuyến"))
        {
            trả lại trực tuyến mới ();
        }
        khác nếu (sourceType.equalsIgnoreCase ("ngoại tuyến"))
        {
            trả lại ngoại tuyến mới ();
        }
        khác
        {
            trả về null;
        }
    }

    @Ghi đè
    khóa học công khai getC thảo (String CourseType)
    {
       trả về null;
    }
    
}

Bước 8:

  • Tạo một lớp chính gọi lớp Tóm tắt Factory để lấy đối tượng lớp Factory thực sự và sau đó nó sử dụng đối tượng đó để thực hiện các hoạt động khác.
 lớp công khai Ví dụ
{
    public static void main (String [] args)
    {
        Khóa học SourceC thuyếtFactory = FactoryCreator.getSourceCferenceFactory ("khóa học");

        System.out.println (Course.getCourse ("lập trình"). GetC thuyếtName ());

        SourceC thuyếtFactory source = FactoryCreator.getSourceCferenceFactory ("nguồn");
        System.out.println (source.getSource ("trực tuyến"). GetSourceName ());

    }
}