Factory method pattern là gì

1. Factory Pattern là gì?

Factory Pattern là một mẫu thiết kế tạo dựng (Creation Pattern), nó được sử dụng rộng rãi trong JDK và các Framework như Spring, Struts.

Đang xem: Factory pattern là gì

Factory Pattern được sử dụng khi có một class cha (super class) với nhiều class con (sub-class), dựa trên đầu vào và phải trả về 1 trong những class con đó.

Lợi ích của Factory PatternCung cấp 1 hướng tiếp cận với Interface thay thì các cài đặt.Mở rộng code dễ dàng hơn (Khi muốn mở rộng thêm 1 loại class con khác, ta chỉ việc thêm mới nó và sửa đầu vào trong Factory Method là được).Ví dụ: Một số class, method áp dụng Factory Pattern trong JDKjava.util.Calendar, ResourceBundle and NumberFormat là các class sử dụng Factory Pattern.Method valueOf() trong một số wrapper class như Boolean, Integer, Double…2. Factory Pattern UML Diagram

Factory method pattern là gì

ParrentClass: super class

SubClass_1, SubClass_2: Các class cần trả về

Creator: Interface khai báo factoryMethod trả về ParrentClass

ConcreteCreator: Thực hiện cài đặt Creator.

(Thông thường vì chỉ có 1 class ConcreteCreator implement Creator thì Creator sẽ được bỏ qua)

3. Ví dụ

Factory method pattern là gì

Ta có class cha là Computer và 2 class con Server và PC.

Xem thêm: Tổng Hợp Game Lậu Mobile Mới Ra 2021, Game Private Ios

ComputerFactory thực hiện trả về đối tượng Server hoặc PC tùy theo dữ liệu đầu vào.

Computer.java

public abstract class Computer { public abstract String getRAM(); public abstract String getHDD(); public abstract String getCPU();
Override public String toString(){ return “RAM= “+this.getRAM()+”, HDD=”+this.getHDD()+”, CPU=”+this.getCPU(); }}Factory Design Pattern Sub Classes

PC.java

public class PC extends Computer { private String ram; private String hdd; private String cpu; public PC(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; }
Override public String getRAM() { return this.ram; }
Override public String getHDD() { return this.hdd; }
Override public String getCPU() { return this.cpu; }}

Server.java

public class Server extends Computer { private String ram; private String hdd; private String cpu; public Server(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; }
Override public String getRAM() { return this.ram; }
Override public String getHDD() { return this.hdd; }
Override public String getCPU() { return this.cpu; }}Factory Class

ComputerFactory.java

public class ComputerFactory { public static Computer getComputer(String type, String ram, String hdd, String cpu){ if(“PC”.equalsIgnoreCase(type)) return new PC(ram, hdd, cpu); else if(“Server”.equalsIgnoreCase(type)) return new Server(ram, hdd, cpu); return null; }}Một số điểm quan trọng về Factory Pattern là:

Chúng ta cần giữ Factory class là Singleton hoặc giữ method thực hiện trả về subclass là staticDựa trên tham số đầu vào mà ta tạo và trả về các subclass khác nhau (ví dụ ở trên thì getComputer là factory method)

Demo

public class TestFactory { public static void main(String<> args) { Computer pc = ComputerFactory.getComputer(“pc”,”2 GB”,”500 GB”,”2.4 GHz”); Computer server = ComputerFactory.getComputer(“server”,”16 GB”,”1 TB”,”2.9 GHz”); System.out.println(“Factory PC Config::”+pc); System.out.println(“Factory Server Config::”+server); }}Kết quả:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHzFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

References: https://www.journaldev.com/1392/factory-design-pattern-in-java

This entry was posted in Design Pattern and tagged design pattern. Bookmark the permalink.

Xem thêm: nhung cau tho che hay

Điều hướng bài viết

← Singleton Pattern – Code ví dụ Singleton Pattern bằng Java.
Abstract Factory Pattern – Code ví dụ Abstract Factory bằng Java. →



Mẫu thiết kế Factory Method hoặc Factory Pattern được sử dụng để xác định một interface hoặc lớp trừu tượng (abstract) để tạo một đối tượng nhưng để cho các lớp con quyết định lớp nào sẽ khởi tạo. Nói cách khác, các lớp con chịu trách nhiệm tạo ra thể hiện của lớp.

Phương thức Factory Method cũng được gọi là Virtual Constructor.

Nội dung chính

  • Lợi thế của Factory Design Pattern
  • Cách sử dụng mẫu thiết kế Factory Method
  • Biểu đồ UML cho mẫu thiết kế Factory Method
  • Ví dụ mẫu thiết kế Factory Method - tính hóa đơn điện

Lợi thế của Factory Design Pattern

  • Mẫu thiế kế Factory Method cho phép các lớp con chọn kiểu đối tượng cần tạo.
  • Nó thúc đẩy sự liên kết lỏng lẻo bằng cách loại bỏ sự cần thiết phải ràng buộc các lớp cụ thể vào code. Điều đó có nghĩa là code chỉ tương tác với interface hoặc lớp abstract, để nó sẽ làm việc với bất kỳ lớp nào implements interface đó hoặc extends lớp abstract.

Cách sử dụng mẫu thiết kế Factory Method

  • Khi một lớp không biết những lớp con nào sẽ được yêu cầu để tạo ra.
  • Khi một lớp muốn các lớp con của nó chỉ định các đối tượng được tạo ra.
  • Khi các lớp cha chọn việc tạo các đối tượng cho các lớp con của nó.

Biểu đồ UML cho mẫu thiết kế Factory Method

  • Chúng ta sẽ tạo ra một lớp trừu tượng Plan và các lớp cụ thể được extends lớp trừu tượng Plan. Tiếp theo định nghĩa một lớp nhà máy có tên GetPlanFactory.
  • Lớp GenerateBill sẽ sử dụng GetPlanFactory để lấy đối tượng Plan. Nó sẽ chuyển thông tin (DOMESTICPLAN / COMMERCIALPLAN / INSTITUTIONALPLAN) tới GetPalnFactory để có được loại đối tượng cần thiết.

Factory method pattern là gì



Ví dụ mẫu thiết kế Factory Method - tính hóa đơn điện

Step 1: Tạo lớp trừu tượng Plan.

package vn.viettuts.designpattern; public abstract class Plan { protected double rate; abstract void getRate(); public void calculateBill(int units) { System.out.println(units * rate); } }

Step 2: Tạo các lớp cụ thể extends lớp trừu tượng Plan.

package vn.viettuts.designpattern; public class DomesticPlan extends Plan { @Override public void getRate() { rate = 3.50; } }

package vn.viettuts.designpattern; public class CommercialPlan extends Plan { @Override public void getRate() { rate = 7.50; } }

package vn.viettuts.designpattern; public class InstitutionalPlan extends Plan { @Override public void getRate() { rate = 5.50; } }

Step 3: Tạo lớp nhà máy GetPlanFactory để sinh ra các đối tượng của các lớp cụ thể dựa trên thông tin đã cho.

package vn.viettuts.designpattern; public class GetPlanFactory { // sung dung phuong thuc getPlan de lay doi tuong co kieu Plan public Plan getPlan(String planType) { if (planType == null) { return null; } if (planType.equalsIgnoreCase("DOMESTICPLAN")) { return new DomesticPlan(); } else if (planType.equalsIgnoreCase("COMMERCIALPLAN")) { return new CommercialPlan(); } else if (planType.equalsIgnoreCase("INSTITUTIONALPLAN")) { return new InstitutionalPlan(); } return null; } }

Step 4: Sinh ra hóa đơn bằng cách sử dụng GetPlanFactory để lấy đối tượng của lớp cụ thể bằng cách truyền thông tin như sau DOMESTICPLAN hoặc COMMERCIALPLAN hoặc INSTITUTIONALPLAN.

package vn.viettuts.designpattern; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class GenerateBill { public static void main(String args[]) throws IOException { GetPlanFactory planFactory = new GetPlanFactory(); System.out.print("Nhap ten cua plan de tao hoa don: "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String planName = br.readLine(); System.out.print("Nhap so luong don vi cho hoa don: "); int unit = Integer.parseInt(br.readLine()); Plan p = planFactory.getPlan(planName); System.out.print("Hoa don " + planName + " cua " + unit + " don vi la: "); p.getRate(); p.calculateBill(unit); } }

Kết quả:

Nhap ten cua plan de tao hoa don: DOMESTICPLAN Nhap so luong don vi cho hoa don: 20 Hoa don DOMESTICPLAN cua 20 don vi la: 70.0