Factory
- C++ kursu
- İleri seviye
- Ders 32/83
- 5 dk
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
#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
#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
std::unique_ptr<Shape> ____(const std::string& type) {
if (type == "circle") return std::make_unique<Circle>();
return nullptr;
}
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ı |