Návrhový vzor Prototype (GOF)

Popis a ukázka jednoduché implementace v C#

Co je to návrhový vzor?

Návrhový vzor (anglicky design pattern) v softwarovém inženýrství představuje obecné řešení problému, které se využívá při návrhu počítačových programů. viz wiki Návrhový vzor by se dal popsat jako "best practise" pro konkrétní řešení.

GOF (Gang of four)

Základním kamenem pro návrhové vzory se stala kniha Design Patterns: Elements of Reusable Object-Oriented Software, jejímiž autory jsou Erich Gamma, Richard Helm, Ralph Johnson a John Vlissides také známí jako Gang of Four.

Prototype

Vzor prototype nám pomáhá vytvářet instance na základě existujích instancí objektů (tzv. prototypů) jejich klonováním. To může být výhodné, když vytvořit instanci je časově nebo zdrojově náročné (např složitá logika v konstruktoru), nebo když chceme novou instanci jen málo se lišící od prototypu - namísto nastavování všeho znovu použijeme prototyp a změníme jen to co je třeba, nebo tím můžeme klienta odstínit od konstruktoru.

Ukázka implementace Prototypu v C#

V našem případě máme abstraktní třídu PrototypBudovy, která definuje hlavně metodu Clone která vrací PrototypBudovy, dále máme konkrétní implementace tohoto vzoru a na konec třídu správce prototypů, která má v sobě slovník hotových instancí a na vyžádání vrací klony příslušných objektů.


//vzor prototypu
abstract class PrototypBudovy
{
    protected PrototypBudovy(int podlahovaPlocha, int pocetPater)
    {
        PodlahovaPlocha = podlahovaPlocha;
        PocetPater = pocetPater;
    }
    protected int PodlahovaPlocha { get; set; }
    protected int PocetPater { get; set; }
    public abstract PrototypBudovy Clone();
}

//konkrétní prototypy
class PanelovyDum : PrototypBudovy
{
    public PanelovyDum(int podlahovaPlocha, int pocetPater) : base(podlahovaPlocha, pocetPater) { }
    public override PrototypBudovy Clone()
    {
        return new PanelovyDum(PodlahovaPlocha, PocetPater);
    }
}
class RodinnyDum : PrototypBudovy
{
    public RodinnyDum(int podlahovaPlocha, int pocetPater) : base(podlahovaPlocha, pocetPater) { }
    public override PrototypBudovy Clone()
    {
        return new RodinnyDum(PodlahovaPlocha, PocetPater);
    }
}
class Chalupa : PrototypBudovy
{
    public Chalupa(int podlahovaPlocha, int pocetPater) : base(podlahovaPlocha, pocetPater) { }
    public override PrototypBudovy Clone()
    {
        return new Chalupa(PodlahovaPlocha, PocetPater);
    }
}

//správce prototypů
class SpravcePrototypu
{
    private Dictionary Prototypy = new Dictionary()
    {
        ["panelovydum"] = new PanelovyDum(2000, 6),
        ["rodinnydum"] = new RodinnyDum(200, 2),
        ["chalupa"] = new Chalupa(100, 1)
    };

    public PrototypBudovy VytvorPrototyp(string key)
    {
        if (Prototypy.ContainsKey(key)) return Prototypy[key].Clone();
        else return null;
    }
}
    

Ukázka použití:


Console.WriteLine("Test prototype");

Prototype.SpravcePrototypu spravcePrototypu = new Prototype.SpravcePrototypu();

var panelak = spravcePrototypu.VytvorPrototyp("panelovydum");
var rodinny = spravcePrototypu.VytvorPrototyp("rodinnydum");
var chalupa = spravcePrototypu.VytvorPrototyp("chalupa");

Console.WriteLine($"Prototypy: {string.Join(Environment.NewLine, panelak, rodinny, chalupa )}");
    

Výsledek testu pak vypadá následovně:

Ukázka jednoduché implementace Singletonu

Použito:

  • Pro zobrazení C# kódu použito highlight.pack.js link