STDIO
Tìm kiếm gần đây

    Nội dung

    Design Pattern: Prototype Pattern

    25/03/2017
    03/08/2020
    Design Pattern: Prototype Pattern
    Prototype Pattern là một trong những Pattern phổ biến trong lập trình hướng đối tượng, là một Pattern thuộc nhóm Creational Patterns. Ý tưởng này là một design pattern đặc biệt có liên quan đến việc khởi tạo Object.

    Giới thiệu

    Prototype Pattern là một trong những pattern phổ biến trong lập trình hướng đối tượng, là một pattern thuộc nhóm Creational Patterns. Ý tưởng này là một design pattern đặc biệt có liên quan đến việc khởi tạo đối tượng (Object), thay vì tạo ra Object, Prototype pattern sử dụng việc cloning (copy nguyên mẫu của Object). Nếu việc tạo ra Object lớn và tốn nhiều tài nguyên, bạn hãy nên sử dụng prototype patern.

    Tiền đề bài viết

    Trong quá trình tìm hiểu và học lập tôi nhận thấy rằng Prototype Pattern là một trong những mẫu thiết kế đơn giản nhưng lại hữu ích nên tôi muốn chia sẽ những gì mình tìm hiểu được đến với các bạn.

    Đối tượng hướng đến

    Những lập trình viên đã có kiến thức về OOP và đang tìm hiểu về Design Pattern

    Ý tưởng

    Chúng ta được cung cấp một Object và dùng chính Object này như là một hình mẫu (template) khi cần tạo đối tượng mới. Việc tạo một Object mới sẽ dựa trên Object mẫu mà không sử dụng toán tử new hay constructor được cung cấp bởi ngôn ngữ lập trình. Nguyên nhân là do chúng ta không biết được thông tin nội tại bên trong Object và có thể Object bị che giấu thông tin chỉ cung cấp ra bên ngoài một lượng thông tin giới hạn. Vì vậy không thể dùng toán tử new và sao chép những dữ liệu được Object cung cấp (vốn không đầy đủ) cho một Object mới. Cách tốt nhất là để Object "mẫu" tự xác định thông tin và dữ liệu sao chép.

    Triển khai

    Để cài đặt Prototype Pattern, ta tạo một phương thức Clone() ở lớp cha và triển khai ở các lớp con.

    Cách nhân bản trong prototype có 2 kiểu:

    • Shallow coppy: chỉ nhân bản được value type.
    • Deep coppy: nhân bản được value type và reference type.

    Prototype pattern sẽ sử dụng những abstract class, class diagram dưới đây chỉ có 3 loại và làm cho việc thực hiện rất dễ dàng.

    Untitled

    Những class tham gia vào prototype pattern bao gồm :

    1. Client class - Tạo mới object bằng cách gọi Prototype thực hiện clone chính nó.
    2. Prototype - Khai báo một interface hoặc Abtract class cho việc clone chính nó.
    3. ConcretePrototype - Triển khai những operation cho việc clone chính nó.

    Quá trình sao chép bắt đầu với việc khởi tạo class sẽ lấy làm mẫu. Client class yêu cầu một object mới của loại đó và gửi yêu cầu tới class Prototype. Một ConcretePrototype ( phụ thuộc vào loại object mà Client cần ) sẽ đảm nhận việc sao chép object client thông qua phương thức Clone(). Khi đó một object mới thuộc loại Client sẽ được tạo ra.

    Ưu điểm

    -  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 “, điều này sẽ làm tăng hiệu suất so với việc sử dụng từ khóa new để tạo đối tượng mới.

    -  Khởi tạo object mới bằng cách thay đổi một vài thuộc tính của object (các object có ít điểm khác biệt nhau): Một hệ thống linh động sẽ để cho chúng ta tự định nghĩa một hành động nào đó thông qua sự kết hợp với một object (nghĩa là một phương thức của một class) hơn là định nghĩa một class mới. Client có thể thể hiện một tác động khác bằng cách ủy quyền cho lớp prototype. Đồng thời cách thức khởi tạo này cũng giúp cho chúng ta khai báo một "lớp mới" mà không phải lập trình gì cả. Thực tế thì việc copy một nguyên mẫu giống như việc khởi tạo một object từ một class mới. Prototype pattern giúp giảm số lớp mà hệ thống cần dùng.

    -  Khởi tạo object mới bằng cách thay đổi cấu trúc: Rất nhiều ứng dụng xây dựng hệ thống từ nhiều phần và các phần con. Các phần con lại khởi tạo từ nhiều phần con khác (chia nhỏ bài toán). Prototype pattern cũng hỗ trợ điều này. Nghĩa là các phần đó có thể được khởi tạo từ việc copy một nguyên mẫu từ một "cấu trúc" khác. Miễn là các phần kết hợp đều thể hiện Clone() và được sử dụng với cấu trúc khác nhau làm nguyên mẫu.

    -  Giảm việc phân lớp: Đôi khi hệ thống quá phức tạp vì có quá nhiều class, và cây thừa kế của lớp khởi tạo có quá nhiều lớp song song cùng mức. Prototype pattern rõ ràng làm giảm số lớp và sự phức tạp của cây thừa kế (class hierarchy).

    Cài đặt

    #include <iostream>
    #include <string>
    
    /* Prototype base class. */
    class Prototype
    {
    protected:
    	std::string type;
    	int value;
    
    public:
    	virtual Prototype* clone() = 0;
    
    	std::string getType()
    	{
    		return type;
    	}
    
    	int getValue()
    	{
    		return value;
    	}
    };
    
    class ConcretePrototype1 : public Prototype
    {
    public:
    	ConcretePrototype1(int number)
    	{
    		type = "Type1";
    		value = number;
    	}
    
    	Prototype* clone()
    	{
    		return new ConcretePrototype1(*this);
    	}
    };
    
    class ConcretePrototype2 : public Prototype
    {
    public:
    	ConcretePrototype2(int number)
    	{
    		type = "Type2";
    		value = number;
    	}
    
    	Prototype* clone()
    	{
    		return new ConcretePrototype2(*this);
    	}
    };
    
    /* Factory that manages prorotype instances and produces their clones. */
    class ObjectFactory
    {
    	static Prototype* type1value1;
    	static Prototype* type1value2;
    	static Prototype* type2value1;
    	static Prototype* type2value2;
    
    public:
    	static void  initialize()
    	{
    		type1value1 = new ConcretePrototype1(1);
    		type1value2 = new ConcretePrototype1(2);
    		type2value1 = new ConcretePrototype2(1);
    		type2value2 = new ConcretePrototype2(2);
    	}
    
    	static Prototype* getType1Value1()
    	{
    		return type1value1->clone();
    	}
    
    	static Prototype* getType1Value2()
    	{
    		return type1value2->clone();
    	}
    
    	static Prototype* getType2Value1()
    	{
    		return type2value1->clone();
    	}
    
    	static Prototype* getType2Value2()
    	{
    		return type2value2->clone();
    	}
    };
    
    Prototype* ObjectFactory::type1value1 = 0;
    Prototype* ObjectFactory::type1value2 = 0;
    Prototype* ObjectFactory::type2value1 = 0;
    Prototype* ObjectFactory::type2value2 = 0;
    
    int main()
    {
    	ObjectFactory::initialize();
    	Prototype* object;
    
    	/* All the object were created by cloning the prototypes. */
    	object = ObjectFactory::getType1Value1();
    	std::cout << object->getType() << ": " << object->getValue() << std::endl;
    
    	object = ObjectFactory::getType1Value2();
    	std::cout << object->getType() << ": " << object->getValue() << std::endl;
    
    	object = ObjectFactory::getType2Value1();
    	std::cout << object->getType() << ": " << object->getValue() << std::endl;
    
    	object = ObjectFactory::getType2Value2();
    	std::cout << object->getType() << ": " << object->getValue() << std::endl;
    
    	for (;;);
    	return 0;
    }

    Như vậy tôi đã hoàn thành bài viết về Prototype Pattern của mình, hi vọng bài viết sẽ giúp ích cho các bạn trong quá trình xây dựng mã nguồn. Mọi thắc mắc xin hãy comment bên dưới, tôi sẽ trả lời cho các bạn.

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    Design Pattern: Proxy Pattern

    Design Pattern: Proxy Pattern

    Proxy Pattern là một trong những Design Pattern thường được áp dụng khi phát triển phần mềm cũng như thiết kế game, là một mẫu thiết kế thuộc nhóm Structural patterns. ...

    Software ArchitectureDesign Patterns

    18/10/2017

    Design Pattern: Builder Pattern

    Design Pattern: Builder Pattern

    Builder Pattern là một trong những Design Pattern phổ biến trong thiết kế và phát triển các phần mềm ứng dụng cũng như games. Bài viết sẽ cung cấp các kiến thức ...

    Software ArchitectureDesign Patterns

    05/02/2017

    Design Pattern: Adapter Pattern

    Design Pattern: Adapter Pattern

    Trong lập trình hướng đối tượng, một khái niệm cực kì quan trọng đó là “giao diện của lớp” . Trong bài viết này sẽ đề cập đến một design pattern được sử dụng rất phổ biến ...

    Software ArchitectureDesign Patterns

    28/11/2014

    Design Pattern: Abstract Factory Pattern

    Design Pattern: Abstract Factory Pattern

    Được phát triển dựa trên kiến thức đa hình trong phương pháp lập trình hướng đối tượng. Abstract Factory là một trong những Design Pattern thông dụng, làm các đoạn mã trở ...

    Software ArchitectureDesign Patterns

    01/06/2015

    Design Pattern: Dependency Injection

    Design Pattern: Dependency Injection

    Khi thực hiện những dự án với độ phức tạp cao ngoài việc thiết kế tính năng cho ứng dụng, tổ chức code luôn luôn là vấn đề được đặt lên hàng đầu. Tổ chức tốt giúp lập ...

    Software ArchitectureDesign Patterns

    28/12/2014

    Design Pattern: Singleton Pattern

    Design Pattern: Singleton Pattern

    Singleton Pattern là một trong những Design Pattern rất phổ biến trong phát triển game cũng như ứng dụng. Trong kỹ thuật phần mềm, Singleton là một mẫu thiết kế nhằm hạn ...

    Software ArchitectureDesign Patterns

    07/09/2015

    Design Pattern: Singleton Pattern

    Design Pattern: Singleton Pattern

    Làm thế nào để hiện thực được một đối tượng tồn tại duy nhất song có thể truy xuất mọi lúc mọi nơi trong chương trình. Để giải bài toán trên, người ta hướng đến một giải ...

    Software ArchitectureDesign Patterns

    17/08/2015

    Design Pattern: Factory Pattern

    Design Pattern: Factory Pattern

    Factory Pattern là một trong những Pattern phổ biến trong lập trình hướng đối tượng. Khi một chương trình có nhiều đối tượng, việc quản lý khởi tạo các đối tượng đó sẽ ...

    Software ArchitectureDesign Patterns

    26/07/2015

    Design Pattern: State Pattern

    Design Pattern: State Pattern

    Trong quá trình làm game ở trường, tôi gặp phải một vấn đề khó khăn trong việc xử lý các trạng thái của đối tượng khiến công việc trở nên phức tạp và khó hiểu. Nhưng nhờ ...

    Software ArchitectureDesign Patterns

    06/09/2015

    Design Pattern: MVC Pattern

    Design Pattern: MVC Pattern

    Model – View – Controller hay MVC pattern được sử dụng phổ biến trong mảng ứng dụng web ngày nay. MVC được sử dụng lần đầu tiên tại Smalltalk. Hiện tại, có rất nhiều nền ...

    Software ArchitectureDesign Patterns

    04/12/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020