Design Pattern: Prototype Pattern - C#
C#
25
design pattern
23
White

Rice viết ngày 04/10/2018

Đề bài

Bạn là một lập trình viên, độc thân, mạnh mẽ và cá tính. Bạn thấy phụ nữ ngoài đời phù du quá, bạn quyết định tự tạo ra bạn gái của mình.

Program của chúng ta bao gồm abstract class GirlFriend, class Uyen ( chỉ là mình thích tên này thôi :D ), và main Program.

Class GirlFriend sẽ có các attributes là name, say và response. Class Uyen sẽ kế thừa class GirlFriend và trong Main Program, bạn khai báo một bạn nữ tên Uyên, chương trình sẽ in ra màn hình tên của cô gái, lời bạn muốn nói với cô gái, và lời bạn sẽ trả lời với cô gái.

Hành động

abstract class GirlFriend
{
public string name { get; set; }
public string say { get; set; }
public string response { get; set; }
public GirlFriend(string name, string say, string response)
{
this.name = name;
this.say = say;
this.response = response;
}
}
class Uyen : GirlFriend
{
public Uyen(string name, string say, string response) : base(name, say, response)
{
}
}
class Program
{
static void Main(string[] args)
{
Console.InputEncoding = Encoding.UTF8;
Console.OutputEncoding = Encoding.UTF8;
Uyen uyen = new Uyen("Uyên", "Em ăn cơm chưa", "Anh ăn cơm rồi");
Console.WriteLine($"{uyen.name}, {uyen.say}, {uyen.response}");
Console.ReadLine();
}
}
view raw Prototype-pattern.cs hosted with ❤ by GitHub

Vấn Đề

Có bạn gái rồi, nhưng bạn đôi lúc bạn có những điều thầm kín không dám nói với cô ý, sợ cô ý giận. Bạn muốn kiếm người nói thử để xem phản ứng của cô ấy thế nào. Nhưng biết kiếm ai đây? Đây là lúc chúng ta sử dụng Prototype Pattern.

Định Nghĩa

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. — via internet and Wikipedia.

Theo cách hiểu của mình: Sử dụng Pattern này có nghĩa bạn tạo ra một object mới bằng cách clone object khác đã tồn tại.

Hành Động 2

Trong C#, chúng ta có thể sử dụng interface "Icloneable" (deep copy - Chúng ta còn có thể sử dụng shallow copy nữa nhưng cá nhân mình hay dùng deep copy hơn). Vậy nên chúng ta chỉ cần thay đổi class Uyen chút xíu:

class Uyen : GirlFriend, ICloneable
{
public Uyen(string name, string say, string response) : base(name, say, response)
{
}
public object Clone()
{
return this.MemberwiseClone();
}
}

và trong Main Program:

class Program
{
static void Main(string[] args)
{
Console.InputEncoding = Encoding.UTF8;
Console.OutputEncoding = Encoding.UTF8;
Uyen uyen = new Uyen("Uyên", "Em ăn cơm chưa", "Anh ăn cơm rồi");
Console.WriteLine($"{uyen.name}, {uyen.say}, {uyen.response}");
Uyen cloneOfUyen = (Uyen)uyen.Clone();
cloneOfUyen.say = "Anh ghét em lắm";
Console.WriteLine($"{cloneOfUyen.name}, {cloneOfUyen.say}, {cloneOfUyen.response}");
Console.WriteLine($"{uyen.name}, {uyen.say}, {uyen.response}");
Console.ReadLine();
}
}

Giờ bạn có thể test với clone mà không ảnh hưởng gì đến cô bạn gái kia rồi! :D

Khi nào nên dùng Prototype Pattern

  • Khi bạn muốn tạo run-time object
  • Khi bạn muốn pass object tới function, thay vì dùng object gốc (có thể gây ảnh hưởng tới object data), chúng ta pass clone object.
  • Khi chi phí để tạo ra object mới (dùng operator mới) là quá lớn.

Lời Kết

Mong bài viết trên có thể giúp các bạn phần nào hiểu về Prototype Pattern.

Đây là bài đầu tiên của mình trên Kipalog. Nếu có gì sai sót mong mọi người bỏ qua và có thể góp ý dùm mình. :D.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Rice

10 bài viết.
25 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
15 8
Sản phẩm sau khi làm http://coffeetube.herokuapp.com/ Yêu cầu Nói chung thì giờ download nhạc từ youtube thì nó có vô số cách rồi. Nhưng tự mình...
Rice viết 11 tháng trước
15 8
White
9 4
Trước giờ logic code của mình vẫn luôn dễ dãi như gái làng chơi nên đôi khi nó đã support thêm cho mình cái đức tính càng lúc càng không (thèm) kiê...
Rice viết 10 tháng trước
9 4
White
7 3
Description Mình là một thằng thích đọc sách. Nhưng lúc nào cũng bận (lười) nên cũng mấy tháng rồi chưa hoàn thành được quyển sách nào. Mình đa số...
Rice viết 7 tháng trước
7 3
Bài viết liên quan
White
0 0
Mình khá là lười, nên mình sẽ không đưa định nghĩa hay usage của reflection vào đây. Vì dù sao mình cũng sẽ chỉ copy thôi :smile:. Vậy nên chúng ta...
Rice viết 11 tháng trước
0 0
White
25 4
Tạo dummy data với Faker và Mockaroo – Xa rồi những ngày nhập tay nhàm chán Cuộc đời một thằng developer có rất nhiều việc rất chán nhưng phải làm...
Huy Hoàng Phạm viết gần 4 năm trước
25 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
25 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!