CodeGym /Blog Java /Ngẫu nhiên /Mẫu thiết kế nhà xưởng

Mẫu thiết kế nhà xưởng

Xuất bản trong nhóm
Chào bạn! Hôm nay chúng ta sẽ tiếp tục nghiên cứu về design pattern. Trong bài học này, chúng ta sẽ nói về các nhà máy. Chúng ta sẽ thảo luận vấn đề mà mô hình này giải quyết và xem xét một ví dụ về cách một nhà máy có thể giúp bạn mở một quán cà phê. Ngoài ra, tôi sẽ cung cấp cho bạn 5 bước đơn giản để tạo một nhà máy. Mẫu thiết kế nhà xưởng - 1 Để đảm bảo rằng tất cả chúng ta đều có cùng bước sóng và bạn sẽ nhanh chóng nắm bắt được khái niệm này, bạn nên làm quen với các chủ đề sau:
  • Kế thừa trong Java
  • Thu hẹp và mở rộng các loại tham chiếu trong Java
  • Tương tác giữa các lớp và đối tượng khác nhau.

Nhà máy là gì?

Mẫu thiết kế nhà máy cho phép bạn kiểm soát việc tạo đối tượng. Quá trình tạo một đối tượng mới không quá đơn giản nhưng cũng không quá phức tạp. Chúng ta đều biết rằng chúng ta cần newtoán tử để tạo một đối tượng mới. Có lẽ có vẻ như không có gì để kiểm soát ở đây, nhưng điều đó không đúng. Giả sử ứng dụng của chúng ta có một lớp nhất định có nhiều hậu duệ. Khó khăn có thể phát sinh khi cần tạo một thể hiện của một lớp cụ thể tùy thuộc vào các điều kiện nhất định. Nhà máy là một mẫu thiết kế giúp giải quyết vấn đề tạo các đối tượng khác nhau tùy thuộc vào các điều kiện nhất định. Làm thế nào mà cho một khái niệm trừu tượng? Điều này sẽ rõ ràng và cụ thể hơn khi chúng ta xem ví dụ bên dưới.

Hãy chuẩn bị các loại cà phê khác nhau

Giả sử chúng ta muốn tự động hóa một quán cà phê. Chúng ta cần dạy chương trình của mình cách pha các loại cà phê khác nhau. Để làm điều này, chúng tôi sẽ tạo một lớp cà phê và một vài lớp dẫn xuất để đại diện cho các loại cà phê mà chúng tôi sẽ chuẩn bị: Americano, cappuccino, espresso và latte. Hãy bắt đầu với một lớp cà phê chung:

public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
Tiếp theo, chúng ta sẽ tạo các lớp con của nó:

public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Khách hàng của chúng tôi có thể đặt bất kỳ loại cà phê nào. Đơn đặt hàng của họ cần phải được chuyển đến chương trình. Điều này có thể được thực hiện theo nhiều cách, chẳng hạn như sử dụng String. Nhưng an enumlà tốt nhất cho việc này. Chúng tôi sẽ tạo enumvà xác định các trường enum tương ứng với các loại cà phê có thể được đặt hàng:

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Tuyệt vời. Bây giờ hãy viết mã cho quán cà phê của chúng ta:

public class CoffeeShop {
    
    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;
        
        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Phương pháp này orderCoffeecó thể được chia thành hai phần:
  1. Tạo một ví dụ cụ thể về cà phê trong một switchtuyên bố. Đây là nơi một nhà máy làm những gì nó làm — tạo ra một loại cụ thể tùy thuộc vào điều kiện.
  2. Chuẩn bị — đây là quá trình xay, pha và rót vào cốc.
Sau đây là những điều quan trọng cần biết nếu bạn cần thay đổi phương pháp này trong tương lai:
  1. Các bước liên quan đến quá trình chuẩn bị (xay, pha và rót vào cốc) sẽ không thay đổi (ít nhất là chúng tôi đang tính đến điều này).
  2. Nhưng các loại cà phê có thể thay đổi. Có lẽ chúng ta sẽ bắt đầu làm mocha... Frappu... Mochacci... Sao cũng được, một loại cà phê mới.
Chúng ta đã có thể khá tự tin rằng trong tương lai chúng ta sẽ phải thực hiện các thay đổi đối với switchcâu lệnh của phương thức. Cũng có thể trong quán cà phê của chúng tôi, orderCoffeephương pháp này sẽ không phải là nơi duy nhất chúng tôi tạo ra các loại cà phê khác nhau. Do đó, các thay đổi sẽ phải được thực hiện ở một số nơi. Bạn có thể đã hiểu những gì tôi đang nhận được. Chúng ta cần tái cấu trúc. Di chuyển khối chịu trách nhiệm tạo cà phê vào một lớp riêng biệt vì hai lý do:
  1. Chúng ta có thể sử dụng lại logic pha cà phê ở những nơi khác.
  2. Nếu loại thay đổi, chúng tôi sẽ không phải chỉnh sửa mã ở mọi nơi cà phê được tạo. Chỉ cần thay đổi mã của chúng tôi ở một nơi là đủ.
Nói cách khác, đã đến lúc thành lập một nhà máy.

Thiết lập nhà máy đầu tiên của chúng tôi

Để làm điều này, chúng ta sẽ tạo một lớp mới chỉ chịu trách nhiệm tạo các thể hiện cần thiết của lớp cà phê:

public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }
        
        return coffee;
    }
}
Chúc mừng! Chúng tôi vừa triển khai mẫu thiết kế nhà máy ở dạng đơn giản nhất (gần như). Nó thậm chí có thể đơn giản hơn nếu chúng ta tạo createCoffeephương thức tĩnh. Nhưng sau đó chúng ta sẽ mất hai khả năng:
  1. Khả năng kế thừa SimpleCoffeeFactoryvà ghi đè createCoffeephương thức.
  2. Khả năng thêm triển khai nhà máy cần thiết vào các lớp của chúng tôi.
Nhân tiện, nói về việc triển khai... Chúng ta cần quay lại quán cà phê và thêm nhà máy pha cà phê của mình.

Thêm một nhà máy vào quán cà phê

Hãy viết lại lớp quán cà phê bằng cách sử dụng một nhà máy:

public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Xuất sắc. Bây giờ chúng tôi sẽ cung cấp một mô tả ngắn gọn về cấu trúc chung của mẫu thiết kế nhà máy.

5 bước để mở nhà máy của riêng bạn

Bước 1. Chương trình của bạn có một lớp với một số lớp con, như trong sơ đồ bên dưới: Mẫu thiết kế nhà xưởng - 2Bước 2. Bạn tạo một enumtrường có trường cho mỗi lớp con:

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
Bước 3. Xây dựng nhà máy của bạn. Gọi nó CatFactory. Đây là mã:

class CatFactory {}
Bước 4. Trong nhà máy của bạn, hãy tạo một createCatphương thức nhận CatTypeđối số. Đây là mã:

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
Bước 5. Trong phần nội dung của phương thức, hãy viết một switchcâu lệnh liệt kê các trường enum và tạo một thể hiện của lớp tương ứng với enumgiá trị đã truyền:

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
Bây giờ bạn có thể điều hành một nhà máy như một ông chủ. :)

Làm thế nào để thực hành

Đọc đã tốt, viết mã còn tốt hơn. Nếu tên của bạn có số chữ cái chẵn, hãy thử tạo một tiệm bánh pizza ảo của riêng bạn. Nếu tên của bạn có số lượng chữ cái lẻ, hãy thử tạo một quán sushi ảo. Nếu bạn không có tên, bạn đã may mắn. Hôm nay bạn có thể thư giãn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION