Bài giảng Nhập môn Công nghệ phần mềm - Chương 10: Các mẫu thiết kế phục vụ khởi tạo ₫ối tượng (Creational Patterns)
Bạn đang xem tài liệu "Bài giảng Nhập môn Công nghệ phần mềm - Chương 10: Các mẫu thiết kế phục vụ khởi tạo ₫ối tượng (Creational Patterns)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_nhap_mon_cong_nghe_phan_mem_chuong_10_cac_mau_thie.pdf
Nội dung text: Bài giảng Nhập môn Công nghệ phần mềm - Chương 10: Các mẫu thiết kế phục vụ khởi tạo ₫ối tượng (Creational Patterns)
- Chương 10 Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng (Creational Patterns) 10.1 Tổng quát về nhóm mẫu “Creational” 10.2 Mẫu Abstract Factory 10.3 Mẫu Factory Method 10.4 Mẫu Prototype 10.5 Mẫu Builder 10.6 Mẫu Singleton 10.7 Kếtchương Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 1 10.1 Tổng quát về nhóm mẫu “Creational” Đốitượng thường chứa nhiềuthuộctínhdữ liệuvànhiều tham khảo ₫ếncác₫ốitượng khác. Đoạn code khởitạogiátrị cho các thuộc tính và tham khảo này phụ thuộc hoàn toàn vào sự hiện thựccụ thể của ₫ốitượng. Chúng ta cầntách₫oạn code này khỏi code củaclient sử dụng ₫ốitượng. Thường client muốntạo ₫ốitượng phứchợp mà không cầnquan tâm ₫ến các thông tin cụ thể chi tiếtsau: Đốitượng phứchợpthuộc class cụ thể nào. Nó chứacácloại ₫ốitượng con nào, số lượng ra sao. Mối quan hệ giữacác₫ốitượng con như thế nào. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 2
- 10.1 Tổng quát về nhóm mẫu “Creational” Các mẫuthiếtkế “Creational” sẽ giúp code client linh ₫ộng về mặt khởitạo, quảnlývàsử dụng ₫ốitượng. Chúng có thể cho phép client chủ₫ộng trong việcxác₫ịnh ₫ốitượng nào ₫ượctạo ra, ai tạora₫ốitượng ₫ó, cách thứcvàthời ₫iểmkhởitạo ₫ốitượng ₫ó. Đặc ₫iểmnổibậtcủacácmẫuthiếtkế “creational” là ₫oạn code client cầnsử dụng ₫ốitượng không trựctiếpsinhra₫ốitượng mà nhờ các phầntử trung gian ₫ể tăng ₫ộ linh ₫ộng, tốithiểu hóa sự phụ thuộc vào các class ₫ốitượng cụ thể. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 3 10.2 Mẫu Abstract Factory Mụctiêu: Cung cấp cho Client 1 interface gồmtậptácvụ khởitạocác ₫ốitượng ₫ược dùng trong Client nhưng che dấumọi chi tiếtvề ₫ốitượng ₫ượctạora, thídụ như thuộc class cụ thể nào Một trong các mụctiêucủaviệcviết code ứng dụng là phảicó tính tổng quát cao và ₫ộ ₫ộclậpcaovới chi tiếthiệnthựccủa các ₫ốitượng mà nó dùng. Một trong các phương án ₫ể ₫ạt ₫ượcmụctiêutrênlàkhôngdùnglệnh new ₫ể tạora₫ốitượng cần dùng vì nếu dùng lệnh new thì phảixác₫ịnh tên class cụ thể và như vậysẽ phụ thuộc vào class này. Mẫu AbstractFactory sẽ giúp chúng ta tạo ₫ốitượng mà không cần biết tên class cụ thể ₫ược dùng. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 4
- 10.2 Mẫu Abstract Factory Thí dụ về việcdùngmẫu Abstract factory : Ta muốnviếtchương trình GUI (dùng giao diện ₫ồ họatrực quan) có khả năng chạy trên nhiều platform khác nhau (chương trình multi-platform). Mỗi platform có mộthọ các class miêu tả các ₫ối tượng giao diệnphổ dụng như TextBox, Button, Giả sử các ₫ối tượng giao diệncùngchứcnăng trên các platform khác nhau hỗ trợ cùng interface thống nhất(nếu không ta dùng mẫu Adapter ₫ể có ₫ượckếtquả này). Việcsử dụng cụ thể họ các class giao diện nào chỉ biếtkhichương trình bắt ₫ầuchạy. Để giải quyếtvấn ₫ề trên, cách tốtnhất là dùng mẫu AbstractFactory vớilược ₫ồ class như sau : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 5 10.2 Mẫu Abstract Factory Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 6
- 10.2 Mẫu Abstract Factory Ta có thể xây dựng mẫu AbstractFactory theo loại class pattern vớilược ₫ồ class như sau : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 7 10.2 Mẫu Abstract Factory Các phầntử tham gia : IObjectA, IObjectB : interface thống nhấtcủacác₫ốitượng cùng chứcnăng trong các họ khác nhau. IAbstractFactory : interface của ₫ốitượng chuyên tạocác₫ối tượng dùm cho Client. ConcreteFactory1 : class hiệnthựccáctácvụ tạo ₫ốitượng trong interface IAbstractFactory. Hệ thống có nhiều ConcreteFactory, mỗi ConcreteFactory sinh ra các ₫ốitượng cùng họ, các họ₫ốitượng do các ConcreteFactory tạoratương ₫ồng nhau về vai trò, về chứcnăng. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 8
- 10.2 Mẫu Abstract Factory Các phầntử tham gia (tt) : ObjectA, ObjectB : class hiệnthực ₫ốitượng ₫ượctạorabởi class ConcreteFactory tương ứng, nó hỗ trợ interface sử dụng tương ứng. Client : ₫oạn code cầntạovàsử dụng các ₫ốitượng. Client chỉ sử dụng các interface IAbstractFactory, IObjectA, IObjectB, và như thế hoàn toàn ₫ộclậpvới các class cụ thể mà nó sẽ dùng. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 9 10.2 Mẫu Abstract Factory Quá trình tương tác giữa các phầntử : Tạithời ₫iểmdịch, Client có biến tham khảo ₫ến ₫ốitượng IAbstractFactory (giả sử tên là factory). Tạithời ₫iểm run-time, dựa vào ngữ cảnh, Client sẽ biếtcầnsử dụng họ₫ốitượng nào và nó sẽ tạo ₫ốitượng ConcreteFactory tương ứng rồi gán tham khảo vào biếnfactory. Sau₫ó trong giải thuật, mỗilầntạo ₫ốitượng cần dùng, thông qua biếnfactory, Client sẽ gởi thông ₫iệp ₫ể yêu cầu ConcreteFactory tạora₫ối tượng mong muốn. Client dựa vào interface của ₫ốitượng ₫ượctạora₫ể sử dụng ₫ối tượng này. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 10
- 10.3 Mẫu Method Method Mụctiêu: Client ₫ịnh nghĩa interface các tác vụ khởitạo ₫ốitượng phức hợpcần dùng rồisử dụng các tác vụ này trong ₫oạn code của mình, nhưng không hiệnthựccụ thể các tác vụ khởitạo ₫ối tượng mà ₫ể class con của mình override và hiệnthựctheo yêu cầuriêngcủatừng class con. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 11 10.3 Mẫu Factory Method Thí dụ về việcdùngmẫu Factory method : Các ứng dụng trong bộ MS Office như Word, Excel, PowerPoint ₫ềucócơ chế khởitạo, xử lý tài liệugiống nhau cho dù cấutrúc vậtlýcủacáctàiliệu trong các ứng dụng là khác nhau. Để viết ₫oạn code xử lý tài liệu trong các ứng dụng MS Office nhất quán, ₫ộclậpvớitàiliệucụ thể, Microsoft ₫ã dùng mẫu Factory Method như sau ₫ể thiếtkế các ứng dụng MS Office : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 12
- 10.3 Mẫu Factory Method docs IDocument Application Open() CreateDocument() Document* doc=CreateDocument(); Close() NewDocument() docs.Add(doc); Save() OpenDocument() doc->Open(); Revert() MyDocument MyApplication CreateDocument() return new MyDocument; Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 13 10.3 Mẫu Factory Method Ta có thể xây dựng mẫu Factory Method theo loại class pattern với lược ₫ồ class như sau : docs IProduct Creator FactoryMethod() AnOperation() Product = FactoryMethod(); ConcreteProduct ConcreteCreator FactoryMethod() return new ConcreteProduct; Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 14
- 10.3 Mẫu Factory Method Các phầntử tham gia : Creator (Application) : class chứa code client cầntạovàsử dụng ₫ốitượng phứchợp, nó sẽ chứa ₫ặctả các tác vụ khởitạo ₫ối tượng phứchợpcần dùng. ConcreteCreator (MyApplication) : class hiệnthựccáctácvụ tạo ₫ốitượng trong class cha Creator. IProduct (IDocument) : interface của ₫ốitượng phứchợpcầntạo và sử dụng. ConcreteProduct (MyDocument) : class miêu tả₫ốitượng phức hợpcụ thể cầntạovàsử dụng. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 15 10.4 MẫuPrototype Mụctiêu: Tạo ₫ốitượng mớicónội dung y như₫ốitượng ₫ãcósẵn. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 16
- 10.4 MẫuPrototype Thí dụ về việcdùngmẫu Prototype : Có nhiềukhitamuốntạo ₫ốitượng mớicócấutrúcvànội dung cụ thể giống y như một ₫ộitượng ₫ãcósẵn. Cách tốtnhấtlàdùng mẫu Prototype, ₫ốitượng có sẵn ₫ượcgọi là Prototype và phải chứaítnhấttácvụ Clone() có nhiệmvụ trả về tham khảo ₫ến ₫ối tượng có cấutrúcvànội dung giống như như mình (₫ốitượng ₫ó có thể chínhlàmình). Thường dùng trong các phát biểu gán ₫ốitượng nhưng theo nghĩa giống như lệnh gán dữ liệucổ₫iển: int i1 = 5; C1 c1 = new C1(); //có c1.i = 0; Int i2 = i1; //i2 = 5 c1.i = 5; I1 = 0; //i2 vẫn=5 C1 c2 = c1.Clone(); //c2.i sẽ = 5; c1.i = 0; //c2.i vẫn=5 Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 17 10.4 MẫuPrototype prototype Client Prototype Operation() Clone() ConcretePrototype1 ConcretePrototype2 p = protoype->Clone(); Clone() Clone() return copy of self; return copy of shelf; Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 18
- 10.4 MẫuPrototype Các phầntử tham gia : Prototype : interface miêu tả các tác vụ của ₫ốitượng phứchợp cần dùng bởi Client, trong ₫ócầncótácvụ Clone() vớichứcnăng tạora₫ốitượng có cầutrúcvànội dung giống hệt mình. ConcretePrototype1, : class hiệnthựccáctácvụ trong class cha Prototype theo cách riêng của mình. Client : class miêu tả₫oạn code tạovàsử dụng các ₫ốitượng ConcretePrototype1, ConcretePrototype2 Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 19 10.5 MẫuBuilder Mụctiêu: Giúp Client khởitạo ₫ốitượng phứchợp(baogộp) theo cơ chế tích lũytăng dần thông qua nhiềulầngọidịch vụ của ₫ốitượng Builder. Client không cầnbiết các thông tin hiệnthựccủa ₫ốitượng ₫ó. Cụ thể Client không cầnbiết ₫ốitượng ₫ượctạorathuộc class nào, có cấutrúccụ thể nào, các ₫ốitượng thành phầnthuộc class cụ thể nào Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 20
- 10.5 MẫuBuilder Thí dụ về việcdùngmẫu Builder : Ta muốnviếtchương trình RTFTranslate có chứcnăng ₫ọc file tài liệu theo ₫ịnh dạng RTF rồi chuyểnnội dung gốc thành 1 ₫ịnh dạng xác ₫ịnh nào ₫ó, thí dụ như chuỗivănbản thô mã ASCII, hay ₫ịnh dạng tài liệu khoa học TeX, hay ₫ịnh dạng MSWord, Chodùcần chuyểnvề₫ịnh dạng nào (biếttrước hay chưabiết trước), ta muốn ₫oạn code thựchiện chuyển ₫ịnh dạng phảicó tính tổng quát và ₫ộclậpvới ₫ịnh dạng ₫ích. Cách tốtnhất ₫ể giảiquyếtvấn ₫ề trên là dùng mẫu Builder với lược ₫ồ class như sau : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 21 10.5 MẫuBuilder Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 22
- 10.5 MẫuBuilder Ta có thể xây dựng mẫu Builder theo loại class pattern vớilược ₫ồ class như sau : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 23 10.5 MẫuBuilder Các phầntử tham gia : IBuilder (IConverter) : interface thống nhấtcủa các builder khác nhau. Dicrector (RTFTranslate) : ₫oạn code Client thựchiệngiảithuật tạo và phát triển ₫ốitượng phứchợp, ₫oạn code này phải ₫ộclập với chi tiếtcụ thể về₫ốitượng phứchợp ₫ượctạo ra. Director chỉ sử dụng ₫ốitượng phứchợp thông qua interface thống nhất IComplexObject. ConcreteBuilder1 (ASCIIConverter ) : class ₫ặctả 1 builder cụ thể, builder này sẽ tạo và phát triển ₫ốitượng phứchợp theo cấu trúc riêng do nó quản lý. Nó cũng cung cấptácvụ getResult() ₫ể trả về tham khảo ₫ến ₫ốitượng phứchợp sau khi xây dựng xong, ₫ốitượng phứchợp này phảihiệnthực interface IComplexObject. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 24
- 10.5 MẫuBuilder Các phầntử tham gia : IComplexObject (IResult) : interface thống nhấtcủacác₫ốitượng phứchợp mà các builder khác nhau tạora. ComplexObject1 (ASCIIString ) : class ₫ặctả 1 ₫ốitượng phức hợpcụ thể do 1 builder cụ thể tạora. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 25 10.6 Mẫu Singleton Mụctiêu: Đảmbảochỉ có thể tạo ra 1 instance duy nhấtcủa 1 class chức năng xác ₫ịnh và cấp phát tham khảo ₫ến ₫ốitượng duy nhất này cho các client ₫ể chúng dùng chung. Thựctế trong nhiềuhoạt ₫ộng củahệ thống, ₫ể ₫ảmbảo tính nhất quán và ₫úng ₫ắn trong việcsử dụng tài nguyên củahệ thống, ta phải ₫ảmbảochỉ có thể tạora1 ₫ốitượng quản lý tài nguyên ₫ó. Thí dụ₫ểquảnlýviệcin ấncủa các phầnmềmra1 máyin ₫ược ₫úng ₫ắnvànhất quán, ta chỉ ₫ượctạo1 ₫ốitượng "printer spooler" ₫ể quảnlýmáyin tương ứng. Để quảnlýviệctruyxuất các file trên thiếtbị chứatin của máy, ta chỉ₫ượctạora1 ₫ốitượng quảnlýhệ thống file duy nhất. Để quảnlýcáccửasổứng dụng, ta chỉ ₫ượctạo ra 1 ₫ốitượng quản lý windows duy nhất Để giải quyếtcácvấn ₫ề trên, cách tốtnhấtlàdùngmẫu Singleton Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 26
- 10.6 Mẫu Singleton Thí dụ về việcdùngmẫu Builder : Sau ₫ây là lược ₫ồ class củamẫu Singleton giảiquyếtviệcin ấn củacácứng dụng trên 1 máy in xác ₫ịnh. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 27 10.6 Mẫu Singleton Ta có thể xây dựng mẫu Singleton theo loại class pattern vớilược ₫ồ class như sau : Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 28
- 10.6 Mẫu Singleton Các phầntử tham gia : Singleton (PrintSpooler) : chịu trách nhiệmvề việctạo instance duy nhất cho class Singleton, trả về tham khảo ₫ến ₫ốitượng duy nhất này khi có yêu cầu và không cho phép client tạo thêm ₫ối tượng Singleton khác. Application : khi cần dùng ₫ốitượng Singleton, nó gọitácvụ getInstance() của class Singleton rồi dùng tham khảo này ₫ể truy xuấtdịch vụ của ₫ốitượng. Nó không thể dùng lệnh new ₫ể tạo ₫ốitượng Singleton khác Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 29 10.7 Kếtchương Chương này ₫ãgiớithiệu các thông tin cơ bảnvề nhóm mẫu phụcvụ khởitạo ₫ốitượng phứchợp và thông tin chi tiếtcụ thể về các mẫu Asbtract Factory, Factory Method, Prototype, Builder, Singleton. Khoa Khoa học& Kỹ thuật Máy tính Môn : Nhập môn Công nghệ phầnmềm Trường ĐH Bách Khoa Tp.HCM Chương 10 : Các mẫuthiếtkế phụcvụ khởitạo ₫ốitượng © 2010 Slide 30