Hotline: 0919 365 363; Email: daotao@r2s.edu.vn

Blog

Design pattern trong java: Tìm hiểu từ A-Z

Design pattern trong java
Kiến thức hữu ích

Design pattern trong java: Tìm hiểu từ A-Z

Design pattern trong java là một trong những giải pháp tốt mà người học và người lập trình Java nên biết. Vậy Design pattern là gì? Có những mẫu thiết kế nào, cùng R2S khám phá nhé!

Design pattern trong java là gì?

Design pattern trong java
Design pattern trong java là gì?

Design pattern thay mẫu thiết kế trong Java là giải pháp tốt để giải quyết các vấn đề hoặc nhiệm vụ cụ thể. 

Design pattern là một giải pháp độc lập với ngôn ngữ lập trình để giải quyết các vấn đề phổ biến trong thiết kế hướng đối tượng. Đây sẽ là một ý tưởng chung, không phải là một cài đặt cụ thể. 

Ví dụ, khi tạo một lớp được sử dụng bởi tất cả các lớp khác, Singleton design pattern là giải pháp tốt nhất. Bằng cách sử dụng design pattern, ta sẽ tạo ra những đoạn code linh hoạt hơn, có khả năng tái sử dụng cao, và dễ bảo trì nâng cấp hơn.

Phân loại các design pattern (Types of Design Patterns)

Tùy theo trường hợp mà sẽ có những loại design pattern khác nhau cho bạn sử dụng, có thể điểm qua các loại chính bao gồm:

STTLoại Design patternGiải thích
1Creational PatternsMẫu thiết kế này cung cấp phương pháp tạo ra các đối tượng một cách linh hoạt hơn. Nghĩa là quyết định đối tượng nào được tạo ra tuỳ thuộc vào trường hợp sử dụng nhất định.
2Structural PatternsMẫu thiết kế liên quan đến sự kết hợp giữa các đối tượng với nhau
3Behavioral PatternsMẫu thiết kế này trình bày phương pháp thiết kế liên quan đến hành vi của các đối tượng (objects)
4J2EE PatternsMẫu thiết kế cung cấp phương pháp thiết kế chương trình theo mô hình nhiều tầng (multiple tier)

Tìm hiểu Design Singleton pattern trong Java

Singleton design pattern thuộc nhóm Creational Patterns và là một trong những mẫu thiết kế đơn giản nhất và  Sau đây là ví dụ cài đặt theo Singleton

Phân loại các design pattern (Types of Design Patterns)
Phân loại các design pattern (Types of Design Patterns)

Ví dụ

Như ví dụ sau, chúng ta thực hiện trên cơ sở dữ liệu EMPDB sử dụng SQL Server và trong EMPDB có bảng ACCOUNTS. Câu lệnh tạo bảng này là như sau.

CREATE TABLE ACCOUNTS (
  USERNAME VARCHAR(20) PRIMARY KEY
  ,PASS VARCHAR(20)
)

 

Hướng dẫn cài đặt (Implementation) – Design pattern trong java

Bước 1: Hãy tạo lớp Singleton (JDBCSingleton.java), lưu ý thay đổi phần in đậm màu đỏ cho phù hợp.

package designpatterns.singleton;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCSingleton {

 private static JDBCSingleton jdbc;

 private JDBCSingleton() {
 }

 public static JDBCSingleton getInstance() {

  if (jdbc == null) {
    jdbc = new JDBCSingleton();
  }

  return jdbc;
 }

 private static Connection getConnection() throws Exception {
   return DriverManager.getConnection("jdbc:sqlserver://localhost;databaseName=EMPDB;user=sa;password=sa");
 }

 // Thêm dữ liệu vào db
 public int create(String username, String pass) throws SQLException {

   Connection c = null;
   PreparedStatement ps = null;
   int cnt = 0;

   try {
    c = this.getConnection();

    ps = c.prepareStatement("insert into accounts(username,pass) values(?,?)");
    ps.setString(1, username);
    ps.setString(2, pass);

    cnt = ps.executeUpdate();
   } catch (Exception e) {
     System.out.print(e.toString());
   } finally {
     if (ps != null) {
       ps.close();
     }
     if (c != null) {
       c.close();
     }
   }
   return cnt;
 }

 //Hiển dữ liệu
 public void display(String id) throws SQLException {

   Connection con = null;
   PreparedStatement ps = null;
   ResultSet rs = null;
   int cnt = 0;

   try {
     con = this.getConnection();
     ps = con.prepareStatement("select * from accounts where username = ?");
     ps.setString(1, id);

     rs = ps.executeQuery();

     while (rs.next()) {
       System.out.println("Ten " + rs.getString("username") + " va mat khau " + rs.getString("pass"));
       cnt++;
     }

     if (cnt == 0) {
       System.out.println("Khong co tai khoan nao ton tai");
     }

   } catch (Exception e) {
     System.out.println(e);
   } finally {
     if (rs != null) {
      rs.close();
     }
     if (ps != null) {
      ps.close();
     }
     if (con != null) {
      con.close();
     }
   }
  }
}

Bước 2: Lấy đối tượng từ lớp singleton (JDBCSingletonExample.java)

package designpatterns.singleton;
import java.util.Scanner;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCSingletonExample {

 public static void main(String[] args) throws Exception {

 //JDBCSingleton object = new JDBCSingleton();
  JDBCSingleton jdbc = JDBCSingleton.getInstance();

  Scanner s = new Scanner(System.in);
  int count = 1;
  int choice;

  do {
   System.out.println(" 1. Create account");
   System.out.println(" 2. Display account");
   System.out.println(" 3. Exit");

   System.out.print("Please enter the choice: ");
   choice = s.nextInt();

   //clear buffer
   s.nextLine();

   switch (choice) {
    case 1:
     System.out.print("Nhap ten : ");
     String username = s.nextLine();
     System.out.print("Nhap mat khau : ");
     String password = s.nextLine();

     try {
      int i = jdbc.create(username, password);

      if (i > 0) {
        System.out.println("Them thanh cong");
      } else {
        System.out.println("Them that bai ");
      }

     } catch (Exception e) {
       System.out.println(e);
     }
     break;
   case 2:
     System.out.print("Nhap ten : ");
     username = s.nextLine();

     try {
      jdbc.display(username);
     } catch (Exception e) {
       System.out.println(e);
     }
     break;
   }
  } while (choice != 3);
 }
}

Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau

Adapter pattern trong java

Adapter Pattern được sử dụng như một cầu nối giữa hai giao diện khác nhau (không tương thích) và thuộc vào nhóm Structural Patterns. Mô hình này kết hợp khả năng của hai giao diện độc lập với nhau.

Cài đặt Adapter Pattern

Cài đặt Adapter Pattern

Bước 1: Tạo interface tên MediaPlayer và AdvMediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public interface MediaPlayer {
   public void play(String audioType, String fileName);
}
/**
 *
 * @author giasutinhoc.vn
 */
public interface AdvancedMediaPlayer {
   public void playMp4(String fileName);
}

 Bước 2: Tạo lớp Mp4Player cài đặt giao diện AdvMediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class Mp4Player implements AdvancedMediaPlayer{
   @Override
   public void playMp4(String fileName) {
      System.out.println("Dang phat mp4: "+ fileName);
   }
}

 Bước 3: Tạo lớp MediaAdapter cài đặt giao diện MediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class MediaAdapter implements MediaPlayer {
   AdvancedMediaPlayer advancedMusicPlayer;
   public MediaAdapter(String audioType){
     if (audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer = new Mp4Player();
      }
   }

   @Override
   public void play(String audioType, String fileName) {
     if(audioType.equalsIgnoreCase("mp4")){
         advancedMusicPlayer.playMp4(fileName);
      }
   }
}

 Bước 4: Tạo lớp AudioPlayer cài đặt giao diện MediaPlayer

/**
 *
 * @author giasutinhoc.vn
 */
public class AudioPlayer implements MediaPlayer {
 MediaAdapter mediaAdapter;
 @Override
 public void play(String audioType, String fileName) {
  if(audioType.equalsIgnoreCase("mp3")){
    System.out.println("Dang phat mp3: " + fileName);
  } else if(audioType.equalsIgnoreCase("mp4")){
    mediaAdapter = new MediaAdapter(audioType);
    mediaAdapter.play(audioType, fileName);
  } else{
    System.out.println("Khong hop le. " + audioType + " dinh dang khong duoc ho tro");
  }
 }
}

Bước 5: Sử dụng AudioPlayer để phát nhiều loại audio khác nhau

/**
 *
 * @author giasutinhoc.vn
 */
public class AdapterPatternExample {
   public static void main(String[] args) {
      AudioPlayer ap= new AudioPlayer();
      ap.play("mp3", "yesterday.mp3");
      ap.play("mp4", "jump.mp4");
   }
}

 Kết quả nhận về

Khi chạy chương trình trên, chúng ta nhận được kết quả sau

Dang phat mp3: yesterday.mp3 
Dang phat mp4: jump.mp4

Chain of Responsibility Pattern là gì? Design pattern trong java

Trong mẫu Chain of Responsibility Pattern, người gửi sender sẽ gửi một yêu cầu đến chuỗi chain of objects. 

Yêu cầu này có thể được xử lý bởi bất kỳ đối tượng nào trong chuỗi đối tượng. Chain of Responsibility Pattern là một mẫu thuộc nhóm Behavioral Patterns.

Hướng dẫn cài đặt Chain of Responsibility Pattern

Chúng ta sẽ tạo một lớp trừu tượng AbstractConsole với thuộc tính level. Sau đó, tạo hai loại logger kế thừa từ lớp trừu tượng AbstractConsole. 

Mỗi khi có yêu cầu hiển thị thông báo, hệ thống sẽ xem xét level để hiển thị thông báo phù hợp (hành vi). Nếu không thì hệ thống sẽ chuyển yêu cầu đến logger kế tiếp.

Hướng dẫn cài đặt Chain of Responsibility Pattern
Hướng dẫn cài đặt Chain of Responsibility Pattern

Bước 1: Tạo lớp trừu tượng AbstractConsole

/**
 *
 * @author giasutinhoc.vn
 */
public abstract class AbstractConsole {
   public static int INFO = 1;
   public static int WARNING = 2;
   protected int level;
   protected AbstractConsole nextLogger;

   public void setNextLogger(AbstractConsole nextLogger){
      this.nextLogger = nextLogger;
   }

   public void printMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.printMessage(level, message);
      }
   }

   abstract protected void write(String message);
}

 Bước 2: Tạo lơp InfoLogger kế thừa lớp trừu tượng AbstractConsole

/**
 *
 * @author giasutinhoc.vn
 */
public class InfoLogger extends AbstractConsole {
   //Constructor
   public InfoLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String msg) {
      System.out.println("Info: " + mgs);
   }
}

Bước 3: Tạo lớp WarningLogger kế thừa lớp trừu tượng AbstractConsole

public class WarningLogger extends AbstractConsole {
   public WarningLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String msg) {
      System.out.println("Warning: " + msg);
   }
}

Bước 4: Tạo lớp ChainPatternExample

/**
 *
 * @author giasutinhoc.vn
 */
public class ChainPatternExample {
   private static AbstractConsole getChainOfLoggers(){
      AbstractConsole info = new InfoLogger(AbstractConsole.INFO);
      AbstractConsole warning = new WarningLogger(AbstractConsole.WARNING);      
      info.setNextLogger(warning);
      return info;
   }

   public static void main(String[] args) {
      AbstractConsole ac= getChainOfLoggers();
      ac.printMessage(AbstractConsole.INFO, "Day la info.");
      ac.printMessage(AbstractConsole.WARNING, "Day la warning.");
   }
}

Data Access Object Pattern trong java là gì?

Mẫu Data Access Object Pattern hay DAO Pattern thường được dùng để phân tách thao tác xử lý dữ liệu ra khỏi tầng nghiệp vụ khi xây dựng chương trình. Mẫu DAO Pattern thuộc nhóm J2EE Patterns.

Một số định nghĩa liên quan

Cài đặt DAO Pattern trong Java
Cài đặt DAO Pattern trong Java
  • Data Access Object Interface: Định nghĩa các thao tác trong hệ thống Design pattern trong java
  • Data Access Object Class: Thực hiện các thao tác với dữ liệu từ cơ sở dữ liệu, JSON/XML,… dựa trên Interface và đóng gói chúng.
  • Model Object hoặc Value Object: Là đối tượng sử dụng phương thức get/set để đóng gói dữ liệu vào bên trong để sử dụng được trong hệ thống.

Hướng dẫn cài đặt DAO Pattern trong Java

Bước 1: Tạo lớp Employee (Model Object hoặc Value Object) – Design pattern trong java

/**
 *
 * @author giasutinhoc.vn
 */
public class Employee {
   private int id;
   private String name;
   Employee(int id, String name){
      this.id= id;
      this.name = name;
   }

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Bước 2: Tạo giao diện EmployeeDao (Data Access Object Interface)

/**
 *
 * @author giasutinhoc.vn
 */
import java.util.ArrayList;
public interface EmployeeDao {
   public ArrayList<Employee> getAllEmployees();
   public Employee getEmployee(int id);
   public void updateEmployee(Employee emp);
   public void deleteEmployee(Employee emp);
}

 Bước 3: Tạo lớp EmployeeDaoImpl cài đặt EmployeeDao (Data Access Object Class)

import java.util.ArrayList;
/**
 *
 * @author giasutinhoc.vn
 */
public class EmployeeDaoImpl implements EmployeeDao {
   ArrayList<Employee> alEmp;
   public EmployeeDaoImpl(){
      alEmp = new ArrayList<Employee>();
      Employee e1 = new Employee(1, "Xuân");
      Employee e2 = new Employee(2, "Hạ");
      alEmp.add(e1);
      alEmp.add(e2);
   }

   @Override
   public void deleteEmployee(Employee e) {
      alEmp.remove(e.getId());
      System.out.println("Nhan vien co ID " + e.getId() + "da bi xoa");
   }

   @Override
   public ArrayList<Employee> getAllEmployees() {
      return alEmp;
   }

   @Override
   public Employee getEmployee(int id) {
      return alEmp.get(id);
   }

   @Override
   public void updateEmployee(Employee e) {
      alEmp.get(e.getId()).setName(e.getName());
      System.out.println("Nhan vien co ID " + e.getId() + " da duoc cap nhat");
   }
}

Bước 4: Tạo lớp DaoPatternExample

/**
 *
 * @author giasutinhoc.vn
 */
public class DaoPatternExample {
   public static void main(String[] args) {
      EmployeeDao empDao = new EmployeeDaoImpl();

      //Hiển thị tất cả
      for (Employee e : empDao.getAllEmployees()) {
         System.out.println("Nhan vien: [ID : " + e.getId() + ", Ten : " + e.getName() + "]");
      }

      //Cập nhật
      Employee e = empDao.getAllEmployees().get(0);
      e.setName("Nguyễn Văn Xuân");
      empDao.updateEmployee(e);

      //Hiển thị
      e = empDao.getEmployee(0);
      System.out.println("Nhan vien: [ID : " + e.getId() + ", Ten : " + e.getName() + "]");
   }
}

Khi chạy chương trình Design pattern trong java trên, chúng ta thu được kết quả sau

Design pattern trong java

Kết luận 

Design pattern trong java là một phương án không thể thiếu để chạy chương trình. Hy vọng với các ví dụ và giải thích về mẫu thiết kế Creational, Structural,  Behavioral, J2EE sẽ giúp bạn dễ dàng tiếp cận và thực hiện chúng trong Java nhé.

Bài viết gốc được đăng tại: giasutinhoc.vn

Alert: You are not allowed to copy content or view source !!