Trường Đại Học Bách Khoa Hà Nội

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 27

Trường Đại Học Bách Khoa Hà Nội

Viện Điện Tử Viễn Thông

======o0o======

ĐỒ ÁN MÔN HỌC

Lập trình hướng đối tượng

Đề tài:

Thiết kế lớp Shape sử dụng factory method

Người hướng dẫn :

Người thực hiện :

Phạm Đình Doanh SHSV: 20182910

Hà Nội, 9/2020
Mục lục

Giới thiệu................................................................................................................4

1.1 Tổng quan.................................................................................................4

1.2 Mục tiêu và phạm vi.................................................................................4

1.3 Nghiên cứu các phương pháp đã có.........................................................4

1.3.1 Factory method.....................................................................................4

1.3.2 sort() in C++ STL.................................................................................5

2. Tổng quan về hệ thống..................................................................................6

3. Tiêu chí thiết kế..............................................................................................6

3.1 Chỉ tiêu kỹ thuật.......................................................................................6

3.1.1 Input......................................................................................................6

3.1.2 Output...................................................................................................7

3.1.3 Xóa shape.............................................................................................8

3.2 Môi trường hoạt động (Environments).....................................................8

4. Thiết kế hệ thống............................................................................................8

4.1 Cấu trúc dữ liệu........................................................................................8

4.1.1 UML graph of program........................................................................8

4.1.2 UML graph of Factory class................................................................9

4.1.3 UML graph of Shape class.................................................................11

4.1.4 UML graph of Edge class...................................................................12


1
5. Triển khai thực hiện (implementation)......................................................13

5.1 Cấu trúc chung........................................................................................13

5.1.1 Header files........................................................................................13

5.1.2 Resource files......................................................................................14

5.1.3 Source files.........................................................................................14

5.2 Một số đoạn mã quan trọng....................................................................15

5.2.1 Split string..........................................................................................15

5.2.2 Đọc file...............................................................................................17

5.2.3 Sắp xếp theo thứ tự tăng dần chu vi...................................................17

6. Kết quả thực nghiệm...................................................................................18

6.1 Môi trường kiểm tra thuật toán...............................................................18

6.2 Bộ dữ liệu đầu vào..................................................................................19

6.2.1 File input............................................................................................19

6.2.2 Chương trình......................................................................................19

6.3 Kết quả....................................................................................................19

6.3.1 In các hình theo thứ tự tăng dần chu vi..............................................19

6.3.2 Tìm hình có trong danh sách..............................................................20

6.3.3 Xóa 1 cạnh nối tâm.............................................................................21

6.3.4 Xóa 1 hình...........................................................................................23

7. Kết luận.........................................................................................................25

8. Tài liệu tham khảo...........................................Error! Bookmark not defined.

2
3
Giới thiệu

1.1 Tổng quan

Factory method, đầy đủ là Factory method pattern, là thiết kế mẫu hướng đối tượng
trong việc thiết kế phần mềm cho máy tính, nhằm giải quyết vấn đề tạo một đối tượng
mà không cần thiết chỉ ra một cách chính xác lớp nào sẽ được tạo.

Việc sử dụng factory method trong việc xây dựng lớp class, giúp người dùng có thể
tạo các đối tượng một cách dễ dàng, đồng thời giúp nhà phát triển có thể dễ dàng mở
rộng sau này.

1.2 Mục tiêu và phạm vi

Báo cáo trình bày cấu trúc chương trình Shape-Edge-Graph sử dụng design pattern
Factory method. Mô tả chi tiết cấu trúc của từng class (Shape, Edge, Graph), đồng thời
vẽ sơ đồ UML thể hiện mối quan hệ của từng class với nhau.

1.3 Nghiên cứu các phương pháp đã có.

1.3.1 Factory method

Factory method giải quyết vấn đề này bằng cách định nghĩa một phương thức cho việc
tạo đối tượng, và các lớp con thừa kế có thể override để chỉ rõ đối tượng nào được tạo.
Nói chung, “factory method” thường được áp dụng cho những phương thức mà nhiệm
vụ chính của nó là tạo được ra đối tượng.

Mục đích sử dụng của Factory method là:

4
 Tạo ra 1 cách mới trong việc khởi tạo Object thông qua 1 interface chung.

 Khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đấy ( Trong trường
hợp bạn đang muốn viết 1 thư viện để người khác sử dụng )

 Giảm sự phụ thuộc giữa các module, các logic với các class cụ thể, mà chỉ phụ thuộc
vào interface hoặc abstract class.

Chúng ta nên sử dụng factory method trong các trường hợp sau:

 Mẫu này thường được sử dụng trong việc thiết kế toolkit hay framework, đoạn mã của
framework cần thiết phải tạo ra một đối tượng là những lớp con tương ứng tăng tính
mềm dẻo trong việc sử dụng framework đó.

 Khi bạn muốn 1 lớp con, mở rộng từ 1 lớp cha, quyết định lại đối tượng được khởi tạo.

 Khi bạn biết khi nào thì khởi tạo một đối tượng nhưng không biết loại đối tượng nào
được khởi tạo.

 Bạn cần một vài khai báo chồng phương thức tạo với danh sách các tham số như nhau,
điều mà Java không cho phép. Thay vì điều đó ta sử dụng các Factory Method với các
tên khác nhau

1.3.2 sort() in C++ STL

Cú pháp

template <class RandomAccessIterator>

default (1) void sort (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class Compare>


custom (2)
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

5
Trong đó, tham chiếu first và last chỉ đến phần tử đầu và cuối trong mảng mà bạn
muốn sắp xết. Comp là một hàm nhận 2 giá trị trong mảng là tham chiếu và trả về giá
trị bool. Giá trị này có thể xác định được vị trí của 2 tham chiếu vừa chuyền vào.

2. Tổng quan về hệ thống

Đầu vào yêu cầu là một file txt chứa thông tin của các đối tượng , còn đầu ra yêu cầu
in ra một menu chứa các chức năng mà người dùng muốn thao tác với các đối tượng.

Class Graph có nhiệm vụ in ra các chức năng mà người dùng muốn thực hiện như in
các shape, tính diện tích,.. Trong đó Factory class sẽ phụ trách việc tạo ra các shape
cũng như các edge.

3. Tiêu chí thiết kế

3.1 Chỉ tiêu kỹ thuật

3.1.1 Input

Chương trình sẽ đọc 1 file txt để lấy dữ liệu của các đối tượng. File txt yêu cầu phải có
định dạng như sau:

- Mỗi dòng chứa các thông số của shape hoặc edge


6
- Các thông số được cho trong dấu ngoặc nhọn {}
- Các thông số cách nhau bởi dấu phẩy (,)
- Thông số đầu tiên là loại shape n
- Tùy thuộc vào thông số đầu tiên về loại shape các thông số sau tương ứng với
vị trí, kích thước, mầu và độ dầy cạnh

VD: File Input.txt có chứa thông tin như sau:

shape{rect,100,100,140,30,blue,21}

shape{rect,15,15,14,3,blue,2}

shape{oval,12,12,14,10,yellow,5}

shape{circle,10,10,4,red,1}

edge{3,2,grey,1}

edge{1,2,green,8}

Như trong file txt trên, ta thấy có 4 shape và 2 edge. Với dòng 1, shape có dạng hình
chữ nhật, có tâm O (100,100), có chiều dài 140cm và chiều rộng 30cm, có màu blue và
độ dày cạnh nối tâm là 21 cm, tương tự như thế với xá dòng tiếp theo. Đối với dòng 5,
cạnh edge có vector chỉ phương là (3,2), màu xám và độ dày là 1 cm.

3.1.2 Output

Màn hình in ra một menu cho người dùng có thể tùy chọn chức năng, vd như sắp xếp
các hình theo thứ tự tăng dần diện tích, in ra các cạnh nối tâm,…

VD:

7
3.1.3 Xóa shape

Yêu cầu phải in ra danh sách các đối tượng để giúp người dùng có thể dễ dàng tìm
được hình họ muốn xóa. Sau khi thực hiện 1 shape thì đồng thời các cạnh nối tâm từ
shape đó đến các shape còn lại sẽ tự động xóa theo .

3.2 Môi trường hoạt động (Environments)

- Window 10 Home
- Chip i5-9300H
- VGA GTX 1050
- IDE Visual studio 2019

4. Thiết kế hệ thống

4.1 Cấu trúc dữ liệu

4.1.1 UML graph of program

8
4.1.2 UML graph of Factory class

9
10
4.1.3 UML graph of Shape class

11
4.1.4 UML graph of Edge class

12
5. Triển khai thực hiện (implementation)

5.1 Cấu trúc chung

5.1.1 Header files

Header files là nơi lưu các file .h, khai báo các lớp cần thiết. Khi muốn sử dụng một
class nào đó, chúng ta phải import file đó vào.

VD: Chúng ta muốn sử dụng class Circle

Trong các file .h , class chỉ cần khai báo các thuộc tính và phương thức, ko cần thiết
phải định nghĩa luôn.

VD:

13
5.1.2 Resource files

Resource files là nơi sẽ chứ hàm main, giúp cho chương trình sẽ được thực hiện. Nếu
không có, chương trình sẽ không được chạy.

VD:

5.1.3 Source files

14
Source file là nơi sẽ định nghĩa các class đã được khai báo ở Header files

VD: class Circle sẽ có dạng như sau

5.2 Một số đoạn mã quan trọng

5.2.1 Split string

Đoạ
n code trên có nhiệm vụ loại bỏ các kí tự thừa có trong file txt.

Vd: File txt có thông tin như sau:

15
shape{rect,100,100,140,30,blue,21}

shape{rect,15,15,14,3,blue,2}

shape{oval,12,12,14,10,yellow,5}

shape{circle,10,10,4,red,1}

edge{3,2,grey,1}

edge{1,2,green,8}

Nhiệm vụ của đoạn code trên là loại bỏ các kí tự thừa “{“, “}”, “,” để chương trình có
thể dễ dàng đọc được. Sau khi dòng code trên được thực hiện file txt sẽ có dạng

shape rect 100 100 140 30 blue 21

shape rect 15 15 14 3 blue 2

shape oval 12 12 14 10 yellow 5

shape circle 10 10 4 red 1

edge 3 2 grey 1

edge 1 2 green 8

16
5.2.2 Đọc file

C++ cung cấp thư viện fstream cho lập trình viên có khả năng thực hiện các thao tác
I/O file. Trong đoạn code trên, ta sử dụng ifstream để đọc file. Mỗi lần getline tương
đương với 1 dòng, dùng vòng lặp while để đọc được tất cả các dòng có trong file. Với
mỗi file, thực hiện hàm split (đã trình bày ở trên), để loại bỏ các kí tự không cần thiết.
Như vậy sau khi đọc xong file, ta có được mảng các giá trị của các đối tượng.

5.2.3 Sắp xếp theo thứ tự tăng dần chu vi

17
Hàm sort là một hàm trong STL algorithm của C++ giúp sắp xếp mảng 1 cách nhanh
chóng và ngắn gọn. Hàm sort có 2 dạng, dạng mà đoạn code trên đang dùng là dạng 2,
có chứa thêm hàm để kiểm tra. Hàm này trả về giá trị bool giúp chúng ta có thể xác
định thứ tự sắp xếp của các phần tử.

6. Kết quả thực nghiệm

6.1 Môi trường kiểm tra thuật toán

- Window 10 Home
- Chip i5-9300H
- VGA GTX 1050
- IDE Visual studio 2019

18
6.2 Bộ dữ liệu đầu vào

6.2.1 File input

- Định dạng tệp tin .txt


- Dung lượng 1KB

6.2.2 Chương trình

- Định dạng tệp tin .exe


- Dung lượng 220KB

6.3 Kết quả

Phần này trình bày các kết quả thu được khi chạy thử chương trình (sự đúng sai, thời
gian thực hiện, số lượng bộ nhớ cần sử dụng).

Chú ý cần có phần nhận xét, đánh giá kết quả thực nghiệm.

6.3.1 In các hình theo thứ tự tăng dần chu vi

- Nhập 1 trong menu để thực hiện in các hình

19
Kết quả in ra hoàn toàn theo đúng với dự định, các hình được sắp xếp theo thứ
tự tăng dần của chu vi, riêng với các cạnh nối tâm thì chu vi được dựa theo
chiều dài của cạnh nối tâm đó.
Kết quả được xuất ra nhanh, không có trường hợp bị treo máy.

6.3.2 Tìm hình có trong danh sách

- Nhập 2 trong menu để thực hiện in các hình

TH1: Nếu cách nối tâm đó tồn tại


20
TH2: Nếu cách nối tâm đó không tồn tại

Kết quả trong hai trường hợp hoàn toàn đúng. Với hai giá trị nhập vào là 100, 100 thì
chương trình in ra 1 hình, còn với hai giá trị 1,1 thì chương trình in ra “NO OBJ
FOUND”, hoàn toàn đúng theo logic.

Kết quả được xuất ra nhanh, không có trường hợp bị treo máy.

6.3.3 Xóa 1 cạnh nối tâm

- Nhập 4 trong menu để thực hiện in các hình

TH1: Nếu cách nối tâm đó tồn tại

21
TH2: Nếu cách nối tâm đó không tồn tại

Kết quả trong hai trường hợp hoàn toàn đúng. Với trường hợp 1, khi cạnh muốn xóa
tồn tại, mảng sau khi xóa sẽ không chứa cạnh đó nữa, kết quả đúng. Với trường hợp 2,
khi cạnh muốn xóa khôngtồn tại, mảng sau khi xóa sẽ vẫn giữ nguyên.
22
Kết quả được xuất ra nhanh, không có trường hợp bị treo máy.

6.3.4 Xóa 1 hình

- Nhập 4 trong menu để thực hiện in các hình


- Yêu cầu khi xóa hình, thì các cạnh nối tâm từ hình đó đến cách hình còn lại đều
sẽ tự động xóa theo

23
TH2: Nếu hình đó không tồn tại

Kết quả được xuất ra nhanh, không có trường hợp bị treo máy

24
7. Kết luận

Như vậy, việc dùng Factory Method trong việc xây dựng class Shape giúp chúng ta có
thể dễ dàng xây dựng và phát triển hơn, đồng thời giúp cho người dùng dễ dàng thực
hiện các thao tác hơn.

Qua việc tìm hiểm về factory method, chúng ta rút ra được những điều sau:

 Abstract Factory có thể được cài đặt vơi Factory Method, nhưng cũng có thể được cài
đặt với Prototype.
Factory Method thường được gọi bên trong Template Method
Factory Method: tạo thông qua thừa kế, Prototype: tạo thông qua sự ủy quyền.

 Thường thường, thiết kế bắt đầu với Factory Method (ít phước tạp, nhiều tùy biến, các
lớp con nhiều) và tiến hóa thành Abstract Factory, Prototype hoặc Builder (có nhiều
mềm dẻo hơn, nhiều sự phức tạp hơn) khi một người thiết kế nhận ra rằng sự mềm dẻo
là cần thiết.

 Prototype không yêu cầu lớp con, nhưng nó yêu cầu một toán tử khởi tạo. Factory
Method yêu cầu lớp con, nhưng không yêu cầu khởi tạo.
Ưu điểm của Factory Method là có thể trả về cùng một đối tượng nhiều lần, hoặc có
thể trả về một lớp con hơn chứ không phải một đối tượng có kiểu chính xác.

 Chủ trương của Factory Method thì đây là vấn đề chính của thiết kê ngôn ngữ (như là
khuyết điểm của thiết kế) rằng tất cả các hàm tạo phải để là private hoặc protected. Đó
là công việc không ai khác là có lớp tạo ra một đối tượng mới hoặc sử dụng lại đối
tượng cũ.

 Toán tử new thì nguy hiểm. Có sự khác biết giữa yêu cầu một đối tượng và tạo một đối
tượng. Toán tử new sẽ luôn tạo một đối tượng, và sẽ không thể đóng goi tạo đối tượng.
Factory Method sẽ thực thi việc đóng gói đó, và cho phép một đối tượng yêu cầu mà
không cần khớp nối chặt chẽ với hành động tạo đối tượng.

8. References

25
GeekforGeek, n.d. Design Patterns | Set 2 (Factory Method). [Online]
Available at: https://www.geeksforgeeks.org/design-patterns-set-2-factory-method/

Tuấn, N. A., n.d. Factory Method. [Online]


Available at: https://nguyenanhtuanweb.wordpress.com/2018/05/30/factory-method/?
fbclid=IwAR2ahj-pPuxIYRLWKjdRRXjiT7Xd_t0K3-
eKQR2K3ChRIe_jPkVz2sqy92o

Zhart, D., n.d. Refactory guru. [Online]


Available at: https://refactoring.guru/design-patterns/factory-method#:~:text=The
%20Factory%20Method%20pattern%20suggests,from%20within%20the%20factory
%20method.

26

You might also like