معرفی الگوی طراحی Prototype

معرفی الگوی طراحی Prototype

مدت مطالعه : 4 دقیقه

12 فروردین 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Prototype را معرفی کنیم.

الگوی پروتوتایپ(Prototype) یک الگوی ایجاد کننده(Creational) است که به شما امکان می‌دهد یک شئ جدید از روی یک شئ موجود ایجاد کنید. شئ جدید همه‌ی مقادیر موجود در شئ اولیه را کپی می‌کند. 

الگوی پروتوتایپ شامل عناصر زیر است:

  • رابط پروتوتایپ: این رابطی(Interface) است که متد های شبیه سازی اشیاء را تعریف می کند. میتواند شامل متد کپی ساده باشد یا کپی هایی خاص با دریافت ورودی.
  • کلاس های پروتوتایپ: این کلاس ها، رابط(Interface) پروتوتایپ را پیاده سازی می‌کنند.
  • کلاینت: این کلاسی است که از پروتوتایپ ها استفاده کرده و اشیاء را کپی می‌کند.

هدف اصلی الگوی پروتوتایپ ایجاد شئ جدید بدون نیاز به ساخت یک شئ از ابتدا است و فقط با کپی یک شئ موجود، شئ جدید ایجاد می‌شود. به‌کار گیری از این الگو در مواقعی که ایجاد اشیاء هزینه بر است یا ساخت شئ نیاز به الزامات پیچیده ای دارد، بسیار مفید است.

در ادامه مثالی از الگوی پروتوتایپ به زبان سی شارپ آمده است:

public interface IPrototype
{
    IPrototype Clone();
}
public class ConcretePrototypeA : IPrototype
{
    private string _name;
    public ConcretePrototypeA(string name)
    {
        _name = name;
    }
    public IPrototype Clone()
    {
        return new ConcretePrototypeA(_name);
    }
}
public class Client
{
    private IPrototype _prototype;
    public Client(IPrototype prototype)
    {
        _prototype = prototype;
    }
    public IPrototype CreatePrototype()
    {
        return _prototype.Clone();
    }
}

در این مثال، رابط IPrototype متد Clone را تعریف می کند که برای ایجاد یک کپی از یک شئ موجود استفاده می شود. کلاس ConcretePrototypeA رابط IPrototype را پیاده سازی کرده و متد شبیه سازی را تعریف می کند. کلاس Client از این امکان در جهت ایجاد کپی از یک شئ موجود استفاده کرده است.

برای ایجاد یک شئ جدید با استفاده از الگوی پروتوتایپ، ابتدا باید یک نمونه اولیه داشته باشیم و سپس با استفاده از متد Clone یک نمونه جدید از شئ موجود ایجاد کنیم. 

 

یک مثال واقعی از الگوی پروتوتایپ

در برنامه فتوشاپ، هر لایه تصویر می تواند حاوی عناصر مختلفی مانند اشکال، متن یا تصاویر باشد. هنگام ایجاد یک لایه جدید، کاربر می تواند یک لایه موجود را کپی کرده و آن را تغییر دهد. الگوی پروتوتایپ می تواند برای شبیه سازی یک لایه موجود استفاده شود، به طوری که لایه جدید با همان محتویات لایه موجود ایجاد می شود، اما می تواند به طور مستقل اصلاح شود.

در این مثال، کلاس Layer نشان دهنده رابط(Interface) پروتوتایپ است که متد Clone را برای ایجاد کپی از لایه ها تعریف می کند. کلاس های ImageLayer و TextLayer کلاس هایی هستند که رابط(Interface) Layer را پیاده سازی کرده و متد Clone را برای ایجاد کپی از لایه ها تعریف می کنند.


public interface Layer
{
    void AddContent(object content);
    Layer Clone();
}
public class ImageLayer : Layer
{
    private List<object> _content = new List<object>();
    public void AddContent(object content)
    {
        _content.Add(content);
    }
    public Layer Clone()
    {
        ImageLayer clonedLayer = new ImageLayer();
        clonedLayer._content = new List<object>(_content);
        return clonedLayer;
    }
}
public class TextLayer : Layer
{
    private List<object> _content = new List<object>();
    public void AddContent(object content)
    {
        _content.Add(content);
    }
    public Layer Clone()
    {
        TextLayer clonedLayer = new TextLayer();
        clonedLayer._content = new List<object>(_content);
        return clonedLayer;
    }
}

برای استفاده از الگوی پروتوتایپ به منظور شبیه سازی لایه ها، باید نمونه ای از یک شی لایه ایجاد کنید و سپس از متد Clone برای ایجاد یک نمونه جدید از لایه استفاده کنید. لایه جدید را می توان مستقل از لایه اصلی تغییر داد. 

var originalLayer = new ImageLayer();
originalLayer.AddContent(new Bitmap("image.jpg"));
var clonedLayer = originalLayer.Clone();
clonedLayer.AddContent(new Bitmap("logo.png"));

در این مثال، شی originalLayer به عنوان لایه اولیه ایجاد می شود. سپس لایه جدیدی با استفاده از متد Clone بوجود می‌آید. clonedLayer را می توان به طور مستقل از originalLayer تغییر داد. 

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه