12/08/2018, 14:26

Tổng hợp một số Design pattern trong Java

Như chúng ta đã biết Design Pattern là kỹ thuật trong lập trình hướng đối tượng, nó rất quan trọng khi giải quyết vấn đề của nhiều bài toán khác nhau. Có thể nói đây là sự đúc kết kinh nghiệm để linh hoạt trong quá trình sử dụng về sau và mỗi lập trình viên muốn giỏi đều phải biết. Trên thực ...

cover_design_pattern.jpg

Như chúng ta đã biết Design Pattern là kỹ thuật trong lập trình hướng đối tượng, nó rất quan trọng khi giải quyết vấn đề của nhiều bài toán khác nhau. Có thể nói đây là sự đúc kết kinh nghiệm để linh hoạt trong quá trình sử dụng về sau và mỗi lập trình viên muốn giỏi đều phải biết.

Trên thực tiễn khi áp dụng có thể sẽ mất nhiều thời gian để ngấm sâu về nó, mong muốn của bài viết là trình bày về 3 design pattern nổi bật thuộc 3 nhóm khác nhau :

  1. Java Singleton (Creational Design Patterns)
  2. Adapter Pattern (Structural Design Patterns)
  3. Chain of Responsibility Pattern (Behavioral Design Patterns)

Singleton-Pattern-Java.png

Java Singleton

Java Singleton thuộc vào 1 trong 5 design pattern của nhóm Creational Design Pattern.

  • Chức năng: Singleton đảm bảo chỉ duy nhất môt new instance được tạo ra và nó sẽ cung cấp cho bạn một method để truy cập đến thực thể đó.
  • Nguyên tắc: Dù cho việc thực hiện bằng cách nào đi nữa cũng dựa vào nguyên tắc dưới đây.
  1. private constructor để hạn chế truy cập từ class bên ngoài
  2. đặt private static variable đảm bảo biến chỉ được khởi tạo trong class.
  3. có một method public để return instance được khởi tạo ở trên.

Khi hiểu được 3 mục đích chính này rồi chúng ta đang hình dung ra cách thức thực hiện có thể dựa trên kinh nghiệm của chính mình. Dưới đây sẽ là một vài cách thức mình nghĩ là khá đầy đủ cho việc tham khảo.

  1. Eager initialization
  2. Static block initialization
  3. Lazy Initialization
  4. Thread Safe Singleton
  5. Bill Pugh Singleton Implementation
  6. Using Reflection to destroy Singleton Pattern
  7. Enum Singleton
  8. Serialization and Singleton

1. Eager initialization

Singleton Class được khởi tạo ngay khi được gọi đến. Đây là cách dễ nhất nhưng nó có một nhược điểm mặc dù instance đã được khởi tạo mà có thể sẽ không dùng tới. Ví dụ:

public class EagerInitializedSingleton {

    private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();

    //private constructor to avoid client applications to use constructor
    private EagerInitializedSingleton(){}

    public static EagerInitializedSingleton getInstance(){
        return instance;
    }
}

2. Static block initialization

Cách làm tương tự như Eager initialization chỉ khác phần static block cung cấp thêm option cho việc handle. Ví dụ:

public class StaticBlockSingleton {

    private static StaticBlockSingleton instance;

    private StaticBlockSingleton(){}

    //static block initialization for exception handling
    static{
        try{
            instance = new StaticBlockSingleton();
        }catch(Exception e){
            throw new RuntimeException("Exception occured in creating singleton instance");
        }
    }

    public static StaticBlockSingleton getInstance(){
        return instance;
    }
}

3. Lazy Initialization

Là một cách làm mang tính mở rộng hơn so với 2 cách làm trên và hoạt động tốt trong từng thread đơn lẻ. Và tất nhiên vấn để xấu sẽ sảy ra nếu chúng ta đang dùng nó với multi thread.             </div>
            
            <div class=

0