1. Factory Pattern là gì? Show 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 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ụ 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();
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; } 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; } 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) Demopublic 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. 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ệnStep 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 |