Chúng ta lại gặp nhau.
Trường hợp bạn đến một cửa hàng bán bia. Bạn nói cho tôi 1 lon bia 333. Thì chủ cửa hàng sẽ đưa cho bạn 1 lon bia 333. Bạn chỉ cần thông báo tới người bán hàng loại bia mình cần và cửa hàng sẽ lấy cho bạn 1 lon bia 333 mới mà và bạn có thể dùng nó. bạn không quan tâm đến nó được sản xuất thế nào mà chỉ cần sử dụng chúng.
Trong lập trình chúng ta cũng vậy. Chúng ta có thể tạo ra những đối tượng bằng phương thức “new”
Bia bia333 = new Bia (333);
Trong đó Bia là một đối tượng. Và chúng ta có đối tượng để sử dụng chúng.
Nhưng vào một ngày đẹp trời nào đó chúng ta thay đổi phương thức tạo ra Bia 333
Bia bia333 = new Bia (bia_333);
Vậy là chúng ta đi tìm tất cả mọi chỗ liên quan đến khởi tạo Bia 333 và chỉnh sửa chúng.Một việc làm khá khó khăn.
Hôm nay tôi muốn giới thiệu cho các bạn 1 Pattern để làm được việc này rõ ràng hơn và chính xác hơn. Đây là pattern được sử dụng rất nhiều trong các ngôn ngữ java, cũng như .Net . Nó giải quyết được những khó khăn của phương thức “new”. Đó là Factory Pattern. Như tôi giới thiệu về pattern Chúng ta biết rằng FactoryPatter là loại creation Pattern ( Nhóm khởi tạo ). Nó có nhiệm vụ khởi tạo. Giống như tên của chúng là Factory. Nó như một nhà máy sản xuất ra các sản phẩm tương tự nhau.
Vâng. Vậy cài đặt nó như thế nào.
Sự cài đặt thực sự đơn giản.
>> Client cần một Product. Nhưng thay vì cài đặt trực tiếp bằng phương thức new. Thì chúng ta yêu cầu Factory cung cấp một Product. Chúng ta đưa các yêu cầu cho Factory để tạo Object mà chúng ta cần.
>> Factory tạo ra một Product cụ thể và trả về cho Client dùng.
>> Các Client dùng Các Abstract Product mà không cần biết cụ thể các cài đặt phía trong của Product muốn tạo.
Tóm lại khi nói tới Factory Pattern. Chúng ta nghĩ đến trường hợp. Bạn đã có Factory. Bạn cần một Product bạn sẽ đưa ra các thông số và hỏi xem có Object nào không.
Tiếp theo chúng ta sẽ vẽ UML của một bài toán nhỏ.
Bài toán :
Sau khi kinh doanh bất động sản bất thành. Tôi thấy rằng người dùng bây giờ quan tâm tới các loại bánh nhiều hơn. Đặc biệt là các loại bánh truyền thống và một số bánh cao cấp. Và sau khi tư vấn của các chuyên gia kinh tế tôi quyết định đầu tư vào dây chuyền sản xuất.
Trước mắt tôi muốn sản xuất ra 2 loại bánh ( bánh mỳ sài gòn và bánh mì đặc ruột ). Tôi suy nghĩ phải mua 2 cái máy. Mỗi máy chúng ta sẽ sản xuất ra 1 loại bánh. Và tôi bắt tay vào sản xuất. ban đầu tôi bán rất tốt với việc chia phiên chẵn lẻ các ngày trong tuần. Nhưng việc kinh doanh không phải lúc nào cũng dễ.
Sau 3 tháng tôi bị các đối thủ cùng cạnh tranh. Họ sản xuất ra các loại bánh tốt hơn. Và sản phẩm của tôi ngày càng ế ẩm. Tôi nghe rằng bên chỗ công ty SấmSét các kỹ sư đã thiết kế ra được một cái máy có thể sản xuất ra loại bánh nào cũng được chỉ cần thay đổi tỉ lệ làm bánh thôi.
Trước mắt tôi cần làm ra 3 loại bánh. Tỉ lệ bột/đường/hương liệu/thời gian/nhiệt độ )
Bánh mỳ sài gòn | 20 | 10 | 30 | 30 | 70 |
Bánh mỳ đặc ruột | 40 | 10 | 30 | 40 | 75 |
Bánh mỳ que | 10 | 15 | 20 | 20 | 60 |
Câu hỏi : Hãy dùng một trong những pattern bạn đã học để vẽ cấu trúc chiếc máy mà các kỹ sư công Ty SấmSét đã thiết kế cho người sản xuất bánh mỳ.
Trả lời :
Nhận xét : Chúng ta thấy việc sản xuất các loại bánh dựa trên tỉ lệ khác nhau. Nhưng chúng đều là một loại bánh mỳ. Có thể là sài gòn,đặc ruột, que. Vậy đầu tiên chiếc máy này phải sản xuất ra được 3 loại bánh. Vậy chúng ta có thể nói đây là Creation Pattern. ( pattern để tạo ra đối tượng)
hơn nữa. Việc tạo ra các đối tượng dựa vào một số đặc điểm biết trước thì chúng ta cần tới Factory Pattern. Tại vì với Factory chúng ta có thể cho các tham số đầu vào thích hợp và nhận lấy được một Product thích hợp.
Vậy UML của nó như thế nào.
Bạn hãy cài đặt code của với ngôn ngữ của bạn nhé.
Bài viết hay quá!
Hơi trừu tượng 🙂
Bài viết tốt!
Toàn tìm đọc thì thấy bài viết của tác giả này nó đở trừu tượng hơn của Tom đó.
http://www.butchiso.com/2011/04/factory-pattern.html
Bài toán của Tom đau đầu thật đó, có thể đơn giản hơn chút nửa sẽ hay hơn.
Em xin giải bài toán Bánh Mì của anh Tom như sau, có gì mọi người chỉnh sửa góp ý cho em nha! 🙂
public class BanhMi {
float _bot;
set Bot(_bot){
return Bot=_bot;
}
get{
return _bot;
}
/*………………………..*/
float _duong;
set Duong(_duong){
return Duong=_duong;
}
get{
return _duong;
}
/*………………………..*/
float _nguyenLieu;
set nguyenLieu(_nguyenLieu){
return nguyenLieu=_nguyenLieu;
}
get{
return _nguyenLieu;
}
/*………………………..*/
float _thoiGian;
set thoiGian(_thoiGian){
return thoiGian=_thoiGian;
}
get{
return _thoiGian;
}
/*………………………..*/
float _nhietDo;
set nhietDo(_nhietDo){
return nhietDo=_nhietDo;
}
get{
return _nhietDo;
}
virtual void Create()
};
/*………………………..*/
class BanhMiSaiGon : public BanhMi {
public:
void Create(){
cout<<"Banh mi Sai Gon n" ;
}
};
/*………………………..*/
class BanhMiDacRuot : public BanhMi {
public:
void Create(){
cout<<"Banh mi Dac Ruot n" ;
}
};
/*………………………..*/
class BanhMiQue : public BanhMi {
public:
void Create(){
cout<> _bot >> _duong >> _nguyeLieu >> _thoiGian >> _nhietDo;
String * typeBanhMi = banhMiFactory -> loaiBanhMi(_bot, _duong, _nguyenLieu, _thoiGian, _nhietDo);
BanhMi *banhMi = banhMiFactory->newBanhMi(typeBanhMi);
if(banhMi)
banhMi->Create();
else
cout<<"Sai..";
}
Chưa đúng rồi.
Cái mà factory return ra không phải là String mà là đối tượng BanhMy.
Hix..Dạ. Mà hình như em up bị thiếu 1 đoạn code rồi.. 🙁