Month: May 2020

Factory Design Pattern

Manager Class : Merhaba, ben bir A nesnesi yaratmak istiyorum.

Geliştirici : O zaman Factory nesnesine başvurman gerek.

Factory design pattern’ı yukarıdaki kısa konuşma özetliyor aslında. Nesne yaratmak için Factory nesneleri oluştururuz ve nesne yaratmak istediğimizde, Factory nesnelerine başvururuz. Gelin Unity’de basit bir örneği gerçekleyelim.

Uygulayacağımız Örneğin Senaryosu

Bir shape renderer’ımız olacak. Bu renderer içinde bir shape listesi bulunduracak. Bu örneğe özel olarak, renderer, ShapeFactory nesnemize başvurarak render etmek istediği nesneleri alacak. Ve render edecek.

Adım 1

Bu adımda ana sınıfımızı, yani Shape sınıfını yazacağız.

using UnityEngine;
public class Shape 
{
    protected Vector3 _center;
    
    public virtual void Draw()
    {
         
    }
}

Shape sınıfımız, bütün diğer Shape’lerde olacak olan, _center Vector3’ünü taşıyor. Ve gene diğer tüm Shape nesnelerinde olması gereken Draw() metodunu bünyesinde barındırıyor.

Adım 2

Bu adımda Cube ve Sphere nesnelerimizi oluşturalım ve onları Shape nesnesinden türetelim.

Cube Nesnesi

using UnityEngine;
public class Cube : Shape
{
    private Vector3 _size;
    
    public Cube(Vector3 center, Vector3 size)
    {
        _center = center;
        _size = size;
    }
    
    public override void Draw()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(_center, _size);
    }
}

Cube nesnesi, türetildiği Shape nesnesine ek olarak, bir de _size değişkeni barındırıyor. _size(yükseklik, genişlik, derinlik) olarak anlaşılmalıdır.

Sphere Nesnesi

using UnityEngine;
public class Sphere : Shape
{
    private float _radious;
    
    public Sphere(Vector3 center, float radius)
    {
        _center = center;
        _radious = radius;
    }
    public override void Draw()
    {
        Gizmos.color = Color.black;
        Gizmos.DrawSphere(_center, _radious);
    }
}

Sphere nesnesi türetildiği Shape nesnesinin değişkenlerine ek olarak bir de radious değişkeni tutuyor. _radious değişkeni, çizeceğimiz Sphere’in yarı çapıdır.

Cube ve Sphere nesnelerinin Constructor’larında, nesnelere center ve ilgili değişkeni atanmakta, nesneler oluşturulmaktadır. Ayrıca bu nesneler Draw metodunu override ederek, bu metodu kendilerine göre özelleştirmektedirler.

Adım 3

Bu adımda ShapeFactory nesnemizi oluşturacağız. Ve bir de Shape tiplerimizi tanımlayacağız.

public enum ShapeType
{
    cube,
    sphere
}

Cube ve Sphere olmak üzere iki adet shape tipi tanımladık.

using UnityEngine;
public class ShapeFactory 
{
    public Shape GetShape(ShapeType shapeType)
    {
        switch (shapeType)
        {
            case ShapeType.cube:
                return new Cube(new Vector3(10,10,10), new Vector3(50,70,90));
            case ShapeType.sphere:
                return new Sphere(new Vector3(80,10,10), 30f);
            default:
                return null;
        }
    }
}

Artık nesne yaratılmak istendiğinde başvuracağımız bir Factory nesnemiz var.

Adım 4

using System.Collections.Generic;
using UnityEngine;
public class ShapeRenderer : MonoBehaviour {
    private List<Shape> Shapes;
    void Start() 
    {
        CreateShapes();
    }
    private void CreateShapes()
    {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shapes = new List<Shape>
        {
            shapeFactory.GetShape(ShapeType.cube),
            shapeFactory.GetShape(ShapeType.sphere)
        };
    }
    private void OnDrawGizmos()
    {
        RenderShapes();
    }
    private void RenderShapes()
    {
        if (Shapes != null)
        {
            for (int i = 0; i < Shapes.Count; i++)
            {
                Shapes[i].Draw();
            }
        }
    }
}

Shape Renderer nesnesi, Start() metodu çağrıldığında Draw() metodunu çağıracağı nesneleri, ShapeFactory’den alır ve OnDrawGizmos() metodu içinde bu nesnelerin Draw() metodlarını çağırarır.

Sonuç olarak, Scene ekranında kırmızı bir cube ve siyah bir sphere nesnesi görürürüz. Sadece Scene ekranında görmemizin sebebi, Gizmos.DrawSphere ve Gizmos.DrawCube metodlarının Scene sahnesinde görülebilecek test çizimleri yapmasıdır. Bu eğitim yazısının asıl amacı Factory design pattern’ı anlatmak olduğu için, Draw.Gizmos metodları kullanılmıştır.

Sorularınız ve önerileriniz için lütfen yorum yapmaktan çekinmeyin. Bana, cosgun.halil@gmail.com adresinden ulaşabilirsiniz.

Saygılar.