Sử dụng Factory Method

Posted on November 8, 2006

3


Do tài liệu về Design Pattern tiếng Việt quá ít nên mình quyết định viết một series bài viết về Design Pattern theo dạng thực hành theo dạng tiễn, các bạn đọc thấy có phần nào không chính xác thì comment để mình có thể bổ xung vào bài viết.

Và trước khi học bất kỳ một Pattern nào hay nhớ: dù có áp dụng pattern nào, bạn vẫn phải chú ý đến việc lập trình hướng đối tượng!
Phần 1: Factory Method
Pre condition: Leader bắt bạn phải viết một component sử dụng JDBC để cung cấp kết nối đến CSDL, tất nhiên nếu bạn đã viết JDBC thì vấn đề này quá đơn giản. Khó khăn là ở đây có hai CSDL, 1 Oracle và 1 MySQL, tuỳ thuộc vào điều kiên bên ngoài đưa vào mà bạn sẽ trả lại kết nối từ Oracle hay MySQL.

Implements:
Trước tiên là đưa cho leader API cho component của bạn đã,:

public interface DataSourceFactory {
public DataSource getDataSource(String control);
}

public interface DataSource {
public Data getData();
}

public class Data {
private String info;

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}

}

Ở đây DataSource lưu trữ thông tin kết nối đến CSDL, DataSourceFactory là interface của Component và Data chỉ là một lớp bean chưa dữ liệu (tôi dùng Data chứa dữ liệu giả thay vì viết code kết nối CSDL thật).

Tiếp tục nào, bạn có 2 CSDL thế nên bạn cần viết DataSource cho mỗi CSDL đó :

public class OracleDataSource implements DataSource {

public Data getData() {
Data data = new Data();
data.setInfo(“data from Oracle”);
return data;
}

}

public class MySQLDataSource implements DataSource {

public Data getData() {
Data data = new Data();
data.setInfo(“data from MySQL”);
return data;
}

}

Okie, bây giờ là thi hành một cái DataSourceFactory để sử dụng 2 lớp DataSource mà bạn đã tạo ra:

public class DataSourceFactoryImpl implements DataSourceFactory {

public DataSource getDataSource(String control) {
if (control.equals(“ORACLE”))
return new OracleDataSource();
else if (control.equals(“MYSQL”))
return new MySQLDataSource();
else
return null;
}

}

Mọi việc đã trở nên rõ ràng, khi nào cần thì lớp bên ngoài truyền vào ORACLE và sẽ nhận được kết nối đến CSDL Oracle, truyền vào MYSQL và sẽ nhận được kết nối đến CSDL MySql.

Post-Condition: sau này với mỗi CSDL thêm vào thì bạn viết thêm lớp kết nối cho CSDL đó và extends DataSourceFactoryImpl để sử dụng lớp kết nối mới đó.

Cuonglm. 8/10/2006