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 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:
Bước 2. Bạn tạo một

- 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ầnnew
toá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 enum
là tốt nhất cho việc này. Chúng tôi sẽ tạo enum
và 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 orderCoffee
có thể được chia thành hai phần:
- Tạo một ví dụ cụ thể về cà phê trong một
switch
tuyê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. - Chuẩn bị — đây là quá trình xay, pha và rót vào cốc.
- 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).
- 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.
switch
câu lệnh của phương thức. Cũng có thể trong quán cà phê của chúng tôi, orderCoffee
phươ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:
- Chúng ta có thể sử dụng lại logic pha cà phê ở những nơi khác.
- 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à đủ.
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 createCoffee
phương thức tĩnh. Nhưng sau đó chúng ta sẽ mất hai khả năng:
- Khả năng kế thừa
SimpleCoffeeFactory
và ghi đècreateCoffee
phương thức. - 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.
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:
enum
trườ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 createCat
phươ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 switch
câ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 enum
giá 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ủ. :)
GO TO FULL VERSION