CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Tìm hiểu Prototype Design Pattern với ví dụ sử dụng ngôn ngữ C#

Đăng lúc: 08:50 AM - 14/11/2022 bởi Charles Chung - 730

Prototype là một mẫu thuộc nhóm Creational Pattern, nó được sử dụng để tạo ra object từ 1 object nguyên mẫu, bằng cách copy các thuộc tính của object đó, mẫu này được sử dụng thường xuyên.

Các thành phần trong prototype pattern

alt text

Trong đó

  • Prototype: Khai báo interface cho phép clone bản thân nó
  • ConcretePrototype: Implements method từ interface để clone chính nó
  • Client: Tạo ra object mới bằng cách gọi prototype để clone nó

Ví dụ demo trong C#

Tệp IStaff.cs

namespace Example01
{
    /// <summary>
    /// Giao diện IStaff (prototype)
    /// </summary>
    public interface IStaff
    {
        IStaff Clone();
        string GetDetails();
    }
}

Tệp Developer.cs

namespace Example01
{
    /// <summary>
    /// Lớp Developer (ConcretePrototype)
    /// </summary>
    public class Developer : IStaff
    {
        public int WordsPerMinute { get; set; }
        public string Name { get; set; }
        public string Role { get; set; }
        public string PreferredLanguage { get; set; }

        public IStaff Clone()
        {
            // Shallow Copy: only top-level objects are duplicated
            return (IStaff)MemberwiseClone();

            // Deep Copy: all objects are duplicated
            //return (IStaff)this.Clone();
        }

        public string GetDetails()
        {
            return string.Format("{0} - {1} - {2}", Name, Role, PreferredLanguage);
        }
    }
}

Tệp Typist.cs

namespace Example01
{
    /// <summary>
    /// Lớp Typist (ConcretePrototype)
    /// </summary>
    public class Typist: IStaff
    {
        public int WordsPerMinute { get; set; }
        public string Name { get; set; }
        public string Role { get; set; }

        public IStaff Clone()
        {
            // Shallow Copy: only top-level objects are duplicated
            return (IStaff)MemberwiseClone();

            // Deep Copy: all objects are duplicated
            //return (IStaff)this.Clone();
        }

        public string GetDetails()
        {
            return string.Format("{0} - {1} - {2}wpm", Name, Role, WordsPerMinute);
        }
    }
}

Tệp Program.cs

namespace Example01
{
    /// <summary>
    /// Lớp Program (Client)
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Developer dev = new Developer();
            dev.Name = "Rahul";
            dev.Role = "Team Leader";
            dev.PreferredLanguage = "C#";

            Developer devCopy = (Developer)dev.Clone();
            devCopy.Name = "Arif"; //Not mention Role and PreferredLanguage, it will copy above

            Console.WriteLine(dev.GetDetails());
            Console.WriteLine(devCopy.GetDetails());

            Typist typist = new Typist();
            typist.Name = "Monu";
            typist.Role = "Typist";
            typist.WordsPerMinute = 120;

            Typist typistCopy = (Typist)typist.Clone();
            typistCopy.Name = "Sahil";
            typistCopy.WordsPerMinute = 115;//Not mention Role, it will copy above

            Console.WriteLine(typist.GetDetails());
            Console.WriteLine(typistCopy.GetDetails());

            Console.ReadKey();
        }
    }
}

Link tải source code demo (Google Drive)

 

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ