CodeBlanks Logo Icon CodeBlanks

Factory

Factory deseniyle nesne oluşturma yöntemini öğrenirsin.

Factory deseni nedir?

Factory, nesne oluşturmayı bir metot arkasına gizler. Çağıran kod hangi somut sınıfın üretildiğini bilmez; yalnızca bir taban sınıf işaretçisi alır. Bu sayede yeni tür eklemek kolaylaşır ve kod gevşek bağlı (loose coupling) olur.

C++'taFactory metodu genelde std::unique_ptr<Base> döndürür. Örnek: std::unique_ptr<Shape> create("circle") çağrısı bir Circle nesnesi döndürür. Yeni şekil eklemek için yalnızca bu metoda bir if dalı eklersin; çağıran kod değişmez.

Soyut taban ve somut sınıflar

Factory için önce bir soyut taban sınıf tanımlarsın; bu sınıfın en az bir virtual metodu olur. Sonra her somut tür bu tabandan türetilir ve sanal metotları geçersiz kılar (override). Factory metodu, çağıran koda soyut tabanı döndürür.

Örnek: class Shape { public: virtual std::string name() const = 0; }; soyut tabandır. class Circle : public Shape ve class Square : public Shape somut sınıflardır. create("circle") bir Circle döndürür ama çağıran yalnızca Shape* görür. Böylece kod somut türlere bağımlı olmaz.

Uygulama ShapeFactory yaz

Shape soyut tabanını tanımla: virtual std::string name() const = 0;. Circle ve Square sınıfları bu tabandan türetilip name()'i geçersiz kılsın (Circle → "Daire", Square → "Kare"). create(const std::string& type) metodu "circle" için Circle, "square" için Square döndürsün. main içinde create("circle") çağırıp name()'i yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <memory>
#include <string>

// Shape soyut tabanını ve Circle/Square sınıflarını tanımla
// create metodunu ekle

int main() {
    // create("circle") çağır ve name() yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <memory>
#include <string>

class Shape {
public:
    virtual ~Shape() = default;
    virtual std::string name() const = 0;
};

class Circle : public Shape {
public:
    std::string name() const override { return "Daire"; }
};

class Square : public Shape {
public:
    std::string name() const override { return "Kare"; }
};

std::unique_ptr<Shape> create(const std::string& type) {
    if (type == "circle") return std::make_unique<Circle>();
    if (type == "square") return std::make_unique<Square>();
    return nullptr;
}

int main() {
    auto s = create("circle");
    std::cout << s->name();
    return 0;
}

Beklenen çıktı

Daire

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 create metodunu tamamla

Soru
std::unique_ptr<Shape> ____(const std::string& type) {
    if (type == "circle") return std::make_unique<Circle>();
    return nullptr;
}
Cevap
std::unique_ptr<Shape> create(const std::string& type) {
    if (type == "circle") return std::make_unique<Circle>();
    return nullptr;
}

Açıklama: create metodu tür bilgisine göre nesne döndürür.

2 Factory metodu ne döndürür?

  • Boş bir nesne
  • Taban sınıf işaretçisini Doğru cevap
  • Bir tamsayı kodu
  • Somut sınıfın kendisini

Açıklama: Factory, somut sınıfı taban işaretçi olarak döndürür.

3 Parçayı rolüne eşle

Kavram Anlamı
class Shape { virtual ... = 0; } Soyut taban
class Circle : public Shape Somut sınıf
std::unique_ptr<Shape> Factory dönüş türü
create("circle") Factory çağrısı

İleri seviye bölümündeki tüm dersler