Design pattern (mẫu thiết kế) trong Java là một tập hợp các giải pháp thiết kế đã được chứng minh cho các vấn đề thiết kế phổ biến trong lập trình. Chúng được sử dụng để giải quyết các vấn đề thiết kế phổ biến, như việc quản lý sự phụ thuộc giữa các lớp, việc tạo ra đối tượng một cách hiệu quả và việc quản lý tài nguyên.
Các bài viết liên quan:
Một số design pattern thông dụng trong Java bao gồm:
- Singleton pattern: cho phép chỉ tạo ra một đối tượng duy nhất của một lớp
- Factory pattern: cho phép tạo ra đối tượng mới mà không cần biết kiểu cụ thể của đối tượng
- Observer pattern: cho phép một đối tượng theo dõi các thay đổi trong một đối tượng khác
- Decorator pattern: cho phép thêm các tính năng mới cho một đối tượng mà không thay đổi kiểu của đối tượ
Singleton pattern trong java
Singleton pattern trong Java là một trong những design pattern quan trọng trong thiết kế phần mềm. Nó đảm bảo rằng một lớp chỉ tạo ra duy nhất một đối tượng duy nhất, và cung cấp một điểm truy cập duy nhất đến đối tượng đó.
Cách thức thiết lập một lớp làm Singleton pattern bao gồm các bước sau:
- Định nghĩa một thuộc tính static để lưu trữ đối tượng Singleton.
- Tạo một constructor private để ngăn chặn tạo ra đối tượng mới từ bên ngoài lớp.
- Tạo một phương thức static để trả về đối tượng Singleton, nếu nó chưa được tạo, thì tạo mới một đối tượng và trả về đối tượng đó.
Ví dụ:
class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } // other methods }
Trong ví dụ trên, chúng ta đã tạo một lớp Singleton với constructor private để ngăn chặn tạo ra đối tượng mới từ bên ngoài lớp. Phương thức static getInstance() trả về đối tượng Singleton duy nhất.
Singleton pattern giúp cho việc quản lý tài nguyên và truy cập dữ liệu trong chương trình của bạn trở nên dễ dàng hơn. Nó đảm bảo rằng chỉ có một đối tượng duy nhất được tạo ra và sử dụng trong toàn bộ chương trình, giúp tiết kiệm bộ nhớ và tăng hiệu suất.
Tuy nhiên, Singleton pattern cũng có một số hạn chế, chẳng hạn như khó khăn trong việc kiểm tra và debug khi chỉ có một đối tượng duy nhất được sử dụng, và khó khăn trong việc tạo ra các đối tượng mới trong các test unit.
Factory pattern trong java
Factory pattern trong Java là một trong những design pattern quan trọng trong thiết kế phần mềm. Nó cho phép tạo ra đối tượng mới mà không cần biết kiểu cụ thể của đối tượng.
Factory pattern bao gồm một factory class và các lớp con được tạo ra bởi factory class. Factory class có một phương thức static hoặc non-static để tạo ra đối tượng mới. Phương thức này sẽ nhận một tham số, ví dụ như kiểu của đối tượng cần tạo, và trả về đối tượng đã được tạo.
Ví dụ:
interface Shape { void draw(); } class Rectangle implements Shape { public void draw() { System.out.println("Inside Rectangle::draw() method."); } } class Square implements Shape { public void draw() { System.out.println("Inside Square::draw() method."); } } class ShapeFactory { public static Shape getShape(String shapeType) { if (shapeType == null) { return null; } if (shapeType.equalsIgnoreCase("RECTANGLE")) { return new Rectangle(); } else if (shapeType.equalsIgnoreCase("SQUARE")) { return new Square(); } return null; } }
Trong ví dụ trên, chúng ta có một interface Shape và hai lớp con Rectangle và Square đều implements Shape. Factory class ShapeFactory có phương thức getShape nhận vào một tham số shapeType và trả về đối tượng Shape tương ứng. Factory pattern giúp cho việc tạo ra đối tượng mới trong chương trình của bạn trở nên dễ dàng hơn và tách biệt logic tạo ra đối tượng và sử dụng đối tượng, giúp cho việc bảo trì và mở rộng chương trình dễ dàng hơn. Tuy nhiên, factory pattern cũ
Tuy nhiên, factory pattern cũng có một số hạn chế, chẳng hạn như sự phức tạp của việc thêm các lớp con mới vào factory class, và khó khăn trong việc debug và test khi logic tạo ra đối tượng và logic sử dụng đối tượng được tách biệt.
Với những hạn chế đó, bạn nên suy nghĩ kĩ trước khi sử dụng Factory pattern trong một dự án của bạn, và chọn một design pattern khác nếu cần thiết.
Observer pattern trong java
Observer pattern trong Java là một trong những design pattern quan trọng trong thiết kế phần mềm. Nó cho phép một đối tượng theo dõi các thay đổi trong một đối tượng khác mà không cần biết chi tiết về cách thức thay đổi đó xảy ra.
Observer pattern bao gồm một Subject và nhiều Observer. Subject là đối tượng mà các Observer theo dõi, và Observer là các đối tượng mà đăng ký với Subject để nhận các thông báo về các thay đổi trong Subject.
Ví dụ:
interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObservers(); } interface Observer { void update(float temp, float humidity, float pressure); } class WeatherData implements Subject { private ArrayList<Observer> observers; private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList<Observer>(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer) observers.get(i); observer.update(temperature, humidity, pressure); } } public void measurementsChanged() { notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } }
Trong ví dụ trên, chúng ta có một interface Subject và một interface Observer, và một class WeatherData implements Subject. WeatherData quản lý một danh sách các Observer đã đăng ký với nó, và gửi thông báo cho chúng khi có thay đổi trong dữ liệu thời tiết. Các Observer có thể đăng ký hoặc hủy đăng ký với WeatherData để nhận các thông báo. Observer pattern giúp cho việc quản lý sự phụ thuộc giữa các đối tượng trong chương trình của bạn trở nên dễ dàng hơn, và cho phép các đối tượng rời khỏi nhau mà không làm ảnh hưởng đến chương trình.
Decorator pattern trong java
Decorator pattern trong Java là một trong những design pattern quan trọng trong thiết kế phần mềm. Nó cho phép bạn thêm các tính năng mới cho một đối tượng mà không thay đổi các đối tượng đó.
Decorator pattern bao gồm một interface hoặc lớp cơ sở và các lớp decorator. Lớp decorator sẽ mở rộng hoặc thay đổi các chức năng của lớp cơ sở.
Ví dụ:
interface Pizza { public String getDescription(); public double getCost(); } abstract class PizzaDecorator implements Pizza { protected Pizza pizza; public PizzaDecorator(Pizza pizza) { this.pizza = pizza; } public String getDescription() { return pizza.getDescription(); } public double getCost() { return pizza.getCost(); } } class Mozzarella extends PizzaDecorator { public Mozzarella(Pizza pizza) { super(pizza); } public String getDescription() { return pizza.getDescription() + ", Mozzarella"; } public double getCost() { return pizza.getCost() + 0.50; } }
Trong ví dụ trên, chúng ta có một interface Pizza và một lớp PizzaDecorator abstract. Các lớp Mozzarella extends PizzaDecorator và thêm vào mô tả và giá cho Pizza.
Decorator pattern cho phép bạn thay đổi các đối tượng mà không cần thay đổi code của chúng, giúp cho việc mở rộng và bảo trì chương trình dễ dàng hơn.