Datgs' Blog

Quyết chiến quyết thắng !

Archive for the tag “creational pattern”

Design Pattern – Creational Pattern – Abstract Factory Pattern

Abstract Factory Pattern được sử dụng khi ta muốn nhóm các factories sản xuất các products có cùng một kiểu hành động.

Ví dụ các Database khác nhau, có cách cấu thành câu truy vấn SQL khác nhau (quotes, delimiter…) (products khác nhau), vì vậy chung một tình huống là truy vấn dữ liệu, và giả sử ta có chung một đối tượng dữ liệu truy vấn cho các products là SelectObject, ta sẽ có:

abstract SQL_Factory with virtue createSqlString(SelectObject) methods
MySQL_Factory extends SQL_Factory implements createSqlString(SelectObject)
MsSQL_Factory extends SQL_Factory implements createSqlString(SelectObject)

In the application:

if(db_adapter == MySQL) $db_Factory = new MySQL_Factory
if(db_adapter == MsSQL) $db_Factory = new MsSQL_Factory
/* Do something to create SelectObject*/
$sql = $db_Factory->createSqlString(SelectObject)
/* Use db connection to execute the sql*/
$results = $db_Factory->getDbConnection()->execute($sq);

Design Pattern – Creational Pattern – Prototype (nguyên mẫu)

Trong phát triển phần mềm, prototype pattern được sử  dụng khi bạn muốn tạo ra một đối tượng có kiểu đã được quy định bởi một thực thể mẫu bằng cách sao chép thực thể ấy để tạo thành đối tượng mới.

Prototype pattern được sử dụng trong trường hợp:

+ Tránh việc tạo nhiều lớp con cho mỗi đối tượng tạo như của abstract factory pattern
+ Giảm chi phí để tạo ra một đối tượng mới theo “chuẩn”, tức là việc này tăng performance so với việc sử dụng từ khóa new để tạo đối tượng mới

Để cài đặt prototype pattern, tạo ra một clone() method ở lớp cha, và triển khai ở các lớp con.

Design Pattern – Creational Pattern – Factory Method

1) Một phương án giải quyết vấn đề tạo object.

2) Câu hỏi là: Làm sao để tạo object mà không cần phải chỉ rõ class cụ thể của object đó là gì?

3) Lợi ích: cho phép chỉ rõ “nội dung” của đối tượng cần tạo. Thường sử dụng các hàm static.

4) Ví dụ về hàm tạo theo cách đặt tên mô tả:

class Complex
{
     public static Complex fromCartesian(double real, double imag) {
         return new Complex(real, imag);
     }

     public static Complex fromPolar(double modulus, double angle) {
         return new Complex(modulus * cos(angle), modulus * sin(angle));
     }

     private Complex(double a, double b) {
         //...
     }
}

Complex c = Complex.fromPolar(1, pi); // Same as fromCartesian(-1, 0)

5) Ví dụ về hàm tạo theo các đóng gói:

public interface ImageReader {
    public DecodedImage getDecodedImage();
}

public class GifReader implements ImageReader {
    public DecodedImage getDecodedImage() {
        return decodedImage;
    }
}

public class JpegReader implements ImageReader {
    // ....
}
public class ImageReaderFactory {
    public static ImageReader getImageReader(InputStream is) {
        int imageType = determineImageType(is);

        switch(imageType) {
            case ImageReaderFactory.GIF:
                return new GifReader(is);
            case ImageReaderFactory.JPEG:
                return new JpegReader(is);
            // etc.
        }
    }
}

6) Hạn chế:

- Nếu hàm tạo (construct method) của class là private, sẽ không tạo được object bằng hàm tạo, mà buộc phải sử dụng hàm factory.
- Không thể mở rộng (kế thừa thêm nữa) ở các subclass nếu hàm tạo là private.
- Không còn đúng cho các subclass. Nếu có subclass gọi hàm factory, nó trả về instance của class chứ khôngphải là nó.

- Giải quyết: cần phải có sự hỗ trợ thêm nữa của các ngôn ngữ lập trình.

Post Navigation

Follow

Get every new post delivered to your Inbox.