0

Design patterns

Bài viết được dịch từ các bài giới thiệu về Design Pattern của trang web Tutorial Point

Tổng quan

Design pattern là gì ?

Design pattern được tổng hợp từ những kinh nghiệp thực tiễn của các lập trình viên hướng đối tượng. Design pattern giải quyết các vấn đề mà lập trình viên thường gặp trong quá trình phát triển phần mềm. Trải qua nhiều lần thử nghiệm và cũng không ít lần mắc phải sai sót, các lập trình viên đã đúc kết ra được những giải pháp tổng quát này.

Bộ tứ tác giả

Năm 1994, bốn tác giả Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides đã cho xuất bản một cuốn sách với tiêu đề Design Patterns - Elements of Reusable Object-Oriented Software, đây là khởi nguồn của khái niệm design pattern trong lập trình phần mềm.

Bốn tác giả trên được biết đến rộng rãi dưới tên Gang of Four (bộ tứ). Theo quan điểm của bốn người, design pattern chủ yếu được dựa theo những quy tắc sau đây về thiết kế hướng đối tượng.

Cách sử dụng Design pattern

Có hai hướng sử dụng chính dành cho Design pattern.

  1. Là một nền tảng chung cho các lập trình viên

Design pattern cung cấp những thuật ngữ chuẩn và hướng tới những tình huống cụ thể. Ví dụ, Design pattern Singleton chỉ ra cách sử dụng các single object, do đó nhưng lập trình viên vốn quen với Design pattern này có thể ứng dụng được các single object và họ có thể chỉ cho những người khác rằng chương trình đó đang đi theo hướng của Singleton pattern.

  1. Là bài tập thực hành tốt

Design pattern đã được phát triển trải qua một quá trình dài và nó cung cấp những giải pháp tốt nhất cho các vấn đề cụ thể thương hay gặp trong phát triển phần mềm. Học những Pattern này giúp cho những lập trình viên chưa có kinh nghiệm có thể học được thiết kế phần mềm một cách đơn giản và dễ dàng.

Các kiểu Design Pattern

Trong cuốn sách Design Patterns - Elements of Reusable Object-Oriented Software, có 23 Design pattern đã được phân loại thành 3 kiểu sau: Creational, Structural, Behavioral. Chúng ta cũng tìm hiểu về một loại Design pattern khác: J2EE.

Pattern Description
Creational Patterns Những Design pattern loại này cung cấp một giải pháp để tạo ra các object và che giấu được logic của việc tạo ra nó, hơn là tạo ra object một cách trực tiếp bằng cách sử dụng method new. Điều này giúp cho chương trình trở nên mềm dẻo hơn trong việc quyết định object nào cần được tạo ra trong những tình huống được đưa ra.
Structural Pattern Những Design pattern loại này liên quan tới class và các thành phần của object. Khái niệm thừa kế được sử dụng để với các interface và định nghĩa những phương hướng để tạo ra các object để thu được những function mới.
Behavioral Patterns Những Design pattern loại này liên quan tới vấn đề giao tiếp giữa các object với nhau.
J2EE Patterns Những Design pattern loại này liên quan tới các vần đề thường gặp và được chỉ ra bởi Trung tâm Sun Java.

Các loại Design Pattern

Factory Pattern

Factory pattern là một trong những design pattern được sử dụng nhiều nhất trong Java. Design pattern này thuộc kiểu Creational pattern, nó cung cấp một trong những cách tốt nhất để tạo ra một object.

Trong Factory pattern, chúng ta tạo ra object mà không làm lộ ra login tạo ra nó tới client và chuyển tới một object được tạo mới bằng cách sử dụng một interface chung.

Cách thực hiện

Chúng ta sẽ tạo một interface Shape và các concrete class sử dụng interface này. Một class Shape Factory sẽ được định nghĩa trong bước tiếp theo.

FactoryPatternDemo, demo class của chúng ta sẽ sử dụng ShapeFactory để lấy ra một object Shape. Nó sẽ chuyển thông tin (HÌNH TRÒN/HÌNH CHỮ NHẬT/HÌNH VUÔNG) tới ShapeFactory để lấy được loại object cần thiết.

factory_pattern_uml_diagram.jpg

  1. Tạo ra một interface.

  2. Tạo ra các concrete class implement interface Shape. Các class : Rectangle.java, Square.java, Circle.java.

  3. Tạo ra một nhà máy (Factory) để tạo mới các object của concrete class dự trên những thông tin đã có.

  4. Sử dụng Factory để lấy các object của concrete class bằng cách pass các thông tin về kiểu của object.

  5. Kiểm tra output.

Source code

Abstract Factory Pattern

Abstract Factory pattern là phương pháp tạo ra một Super-factory dùng để tạo ra các Factory khác. Đây còn được gọi là Factory của các Factory. Đây là một Creational pattern, nó cung cấp một trong những cách tốt nhất để tạo ra một object.

Trong Abstract Factory pattern, một interface có nhiệm vụ tạo ra một Factory của các object có liên quan tới nhau mà không cần phải chỉ ra trực tiếp các class của object. Mỗi Factory được tạo ra có thể tạo ra các object bằng phương pháp giống như Factory pattern.

Cách thực hiện

Chúng ta sẽ tạo ra các interface Shape và Color và các concrete class implement những interface này. Tiếp theo, ta sẽ tạo ra một abstract factory class AbstractFactory. Các class ShapeFactory và ColorFactory được định nghĩa và thừa kế từ class trừu tượng AbstractFactory. Một class FactoryProducer dùng để tạo mới các Factory cũng được tạo ra.

AbstractFactoryPatternDemo, demo class của chúng ta sẽ sử dụng FactoryProducer để lấy một object AbstractFactory. Nó sẽ gửi các thông tin (HÌNH TRÒN/ HÌNH CHỮ NHẬT/HÌNH VUÔNG) tới AbstractFactory để lấy được kiểu object nó cần. Nó cũng gửi các thông tin (MÀU ĐỎ/MÀU LỤC/MÀU LAM) tới AbstractFactory để lấy kiểu object nó cần.

abstractfactory_pattern_uml_diagram.jpg

  1. Tạo ra một interface Shape cho các hình dạng.
  2. Tạo ra các concrete class implement interface này.
  3. Tạo ra interface Color cho các loại màu.
  4. Tạo ra các concreate class implement interface này.
  5. Tạo ra một class trừu tượng để lấy các Factory cho các object Color và Shape.
  6. Tạo ra các class ShapeFactory và Color Factory thừa kế từ class trừu tượng AbstractFactory để tạo ra object của các concrete class dựa trên thông tin được đưa ra.
  7. Tạo ra FactoryProducer class để lấy các Factory bằng cách gửi các thông tin như Shape hay Color.
  8. Sử dụng FactoryProducer để lấy AbstractFactory nhằm lấy các Factory của các concrete class bằng cách gửi thông tin về kiểu.
  9. Kiểm tra output.

Source code

Singleton Pattern

Singleton là một trong những design pattern đơn giản nhất trong Java. Design pattern thuộc loại Creational Pattern.

Pattern này liên quan tới một class có nhiệm vụ tạo ra một object và đảm bảo rằng chỉ có mọt object được tạo ra. Class này cung cấp một phương pháp để truy nhập vào object duy nhất của nó đó là access trực tiếp mà không cần phải tạo instance của class.

Thực hiện

Chúng ta sẽ tạo một class mang tên SingleObject. Class SingleObject có một private constructor một static instance của chính nó.

Class SingleObject cung cấp một static method trả về static instance của nó cho các thành phần bên ngoài class. SingletonPatternDemo, demo class này sẽ sử dụng class SingleObject để lấy về một object của nó.

singleton_pattern_uml_diagram.jpg

  1. Tạo class Singleton.
  2. Lấy ra object duy nhất từ class Singleton.
  3. Kiểm tra output.

Source code

Builder pattern

Builder pattern xây dụng một object phức tạp sử dụng các object đơn giản và sử dụng cách tiếp cận từng bước một. Đây là một creational pattern, nó cung cấp một trong những cách tốt nhất để tạo ra một object.

Một class Builder tạo ra object cuối cùng qua từng bước. Builder này độc lập với các object khác.

Cách thực hiện

Chúng ta sẽ lấy ví dụ về một nhà hàng đồ ăn nhanh nơi các món ăn đặc trưng là Burger và đồ uống lạnh. Burger có thể là Veg Burger hoặc là Chicken Burger và sẽ được gói lại bằng giấy gói. Đồ uống lạnh có thể là Cocacola hoặc Pepsi và sẽ được đóng chai.

Chúng ta sẽ tạ ra một interface tên là Item biểu thị cho các loại đồ như Burger và đồ uống lạnh và các concrete class implement interface Item. Cùng với đó, ta cũng tạo ra một interface Packing biểu thị cho việc đóng gói đồ ăn uống và các concrete class sẽ implement interface Packing, cũng như việc Burger sẽ được gói trong giấy gói và đồ uống lạnh được đóng trong chai.

Tiếp theo, ta sẽ tạo ra một class Meal có một ArrayList của các Item và có một MealBuilder để xây dựng các kiểu khác nhau của object Meal bằng cách tổ hợp các Item. BuilderPatternDemo, demo class này sẽ sử dụng MealBuilder để xây dựng một Meal (bữa ăn).

builder_pattern_uml_diagram.jpg

  1. Tạo interface ItemPacking biểu thị cho các loại đồ ăn thức uống và việc đóng gói.
  2. Tạo ra các concrete class implement interface Packing.
  3. Tạo ra các abstract class BurgerColdDrink implement interface Item để cung cấp các function mặc định cho chúng.
  4. Tạo ra concrete class kế thừa các class BurgerColdDrink.
  5. Tạo ra class Meal có các object Item đã được đinh nghĩa ở trên.
  6. Tạo ra class MealBuilder, đây là class builder thực sự, có nhiệm vụ tạo ra các object Meal.
  7. Tạo class BuilderPatternDemo sử dụng mealBuilder để biểu diễn Builder Pattern.
  8. Kiểm tra output.

Source code

Prototype Pattern

Prototype pattern ứng dụng để tạo ra các object lặp trong khi vẫn duy trì được performance. Prototype pattern thuộc loại Creational pattern.

Pattern này liên quan tới việc xây dựng một interface mẫu để tạo ra các bản sao của một object. Pattern này sử dụng khi việc tạo ra object một cách trực tiếp gây tốn kém tài nguyên. Ví dụ, một object chỉ có thể được tạo ra sau một loạt những thao tác phức tạo trên database. Chúng ta có thể cache object đó, trả về bản sao của nó trong request tiếp theo và update database khi cần thiết do đó có thể giảm thiểu được những lần gọi lệnh database.

Cách thực hiện

Chúng ta sẽ tạo ra một abstract class Shape và các concrete class kế thừa class Shape. Một class ShapeCache được định nghĩa để lưu lại các object Shape trong một Hashtable (bảng băm) và trả và clone của nó khi được request.

Demo class PrototyPatternDemo sẽ sử dụng class ShapeCache để lấy một object Shape.

prototype_pattern_uml_diagram.jpg

  1. Tạo một abstract class implement interface Clonable.
  2. Tạo ra các concrete class thừa kế class trên.
  3. Tạo ra một class ShapeCache để lấy các concrete class từ database và lưu chúng trong một Hashtable.
  4. PrototypePatternDemo sử dụng ShapeCache để lấy các bản sao của các hình dạng lưu trong Hashtable.
  5. Kiểm tra output.

Source code

Adapter Pattern

Adapter pattern hoạt động như một cầu nối giữa hai interface không tương thích. Đây là một loại Structural pattern, pattern này có thể kết hợp khả năng của hai interface độc lập.

Pattern này liên quan tới một clas có nhiệm vụ kết nối các tính năng của các interface độc lập hoặc không tương thích với nhau. Một ví dụ thực tế đó là một máy đọc thẻ có thể hoạt động như một thiết bị chuyển tiếp giữa thẻ nhớ và một laptop. Bạn cắm thẻ nhớ vào máy đọc thẻ và cắm máy đọc thẻ vào laptop, nhờ đó thẻ nhớ có thể được đọc thông qua laptop.

Chúng ta sẽ trình diễn việc sử dụng Adapter pattern bằng ví dụ sau, trong đó một thiết bị chơi audio chỉ có thể mở các file mp3 và muốn sử dụng một thiết bị chơi audio cao cấp có khả năng mở file vlc và mp4.

Cách thực hiện

Chúng ta có một Interface tên là MediaPlayer và một concrete class AudioPlayer implement interface MediaPlayer. Mặc định, AudioPlayer có thể chơi file có định dạng mp3.

Chúng ta có một interface khác là AdvanceMediaPlayer và các concrete class implement interface AdvanceMediaPlayer. Các class này có thể mở file có định dạng mp4 và vlc.

Chúng ta cũng muốn AudioPlayer có thể mở các file định dạng khác. Để làm được điều này, chúng ta sẽ tạo ra một adapter class MediaAdapter, class này implement interface MediaPlayer và sử dụng object của AdvancedMediaPlayer để mở các định dạng yêu cầu.

AudioPlayer sử dụng adapter class MediaAdapter, gửi những định dạng cần mở mà không cần quan tâm class thật có thể mở định dạng đó hay không. AdapterPatternDemo, demo class của chúng ta sẽ sử dụng class AudioPlayer để mở nhiều loại định dạng khác nhau.

adapter_pattern_uml_diagram.jpg

  1. Tạo ra các interface MediaPlayerAdvancedMediaPlayer.
  2. Tạo ra các concrete class implemet interface AdvancedMediaPlayer.
  3. Tạo ra adapter class implement interface MediaPlayer.
  4. Tạo ra concrete class implement interface MediaPlayer.
  5. Sử dụng AudioPlayer để mở nhiều loại audio format khác nhau.
  6. Kiểm tra output.

Source code

(CÒN NỮA)

Reference

  1. http://www.tutorialspoint.com/design_pattern/index.htm

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.