Menu
CoddyTech

Factory Kalıbı

Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 46 / 64.

Fabrika Deseni, nesnelerin tam sınıflarını belirtmeden oluşturulmasını sağlar. Yapıcıları doğrudan çağırmak yerine, hangi sınıfın örneğinin oluşturulacağına karar veren bir fabrika yöntemi kullanırsın.

İşte basit ürün sınıfları:

class Car:
    def __init__(self, brand):
        self.brand = brand
        self.type = "Car"
    
    def info(self):
        return f"{self.type}: {self.brand}"

class Bike:
    def __init__(self, brand):
        self.brand = brand
        self.type = "Bike"
    
    def info(self):
        return f"{self.type}: {self.brand}"

Bu nesneleri üretmek için bir fabrika sınıfı oluştur:

class VehicleFactory:
    def create_vehicle(self, vehicle_type, brand):
        if vehicle_type == "car":
            return Car(brand)
        elif vehicle_type == "bike":
            return Bike(brand)
        else:
            raise ValueError(f"Unknown type: {vehicle_type}")

Nesnelere ihtiyaç duyan koda istemci kodu denir. Yapıcıları doğrudan çağırmak yerine fabrikadan ister:

factory = VehicleFactory()
my_car = factory.create_vehicle("car", "Toyota")
my_bike = factory.create_vehicle("bike", "Honda")

print(my_car.info())   # Araba: Toyota
print(my_bike.info())  # Motosiklet: Honda

*args kullanarak fabrikayı daha esnek hâle getirin:

class FlexibleFactory:
    def create_vehicle(self, vehicle_type, *args):
        if vehicle_type == "car":
            return Car(args[0])  # Yalnızca marka
        elif vehicle_type == "truck":
            return Truck(args[0], args[1])  # Marka ve kapasite
        else:
            raise ValueError(f"Unknown type: {vehicle_type}")

class Truck:
    def __init__(self, brand, capacity):
        self.brand = brand
        self.capacity = capacity
        self.type = "Truck"
    
    def info(self):
        return f"{self.type}: {self.brand} ({self.capacity}t)"

Esnek fabrikayı kullan:

flexible = FlexibleFactory()
car = flexible.create_vehicle("car", "Ford")
truck = flexible.create_vehicle("truck", "Volvo", "20")

print(car.info())    # Araba: Ford
print(truck.info())  # Kamyon: Volvo (20t)

Çıktı:

Car: Toyota
Bike: Honda
Car: Ford
Truck: Volvo (20t)

Önemli Nokta: Factory Pattern, tam sınıflarını bilmeden nesneler oluşturmanı sağlar. Factory method, parametrelere göre hangi sınıfın örnekleneceğine karar verir. Farklı kurucu parametrelerine sahip ürünleri işlemek için *args kullan. Bu, kodunu daha esnek hale getirir ve yeni ürün türleriyle genişletmeyi kolaylaştırır.

challenge icon

Görev

Orta

Bu görevde, kalıtım ve çok biçimlilik kullanarak uygun nesne yönelimli tasarıma sahip bir şekil fabrikası sistemi uygulayacaksın.

Aşağıdaki dosyalardaki uygulamayı tamamla:

  • shape.py - Temel Shape sınıfı
  • circle.py - Circle uygulaması
  • rectangle.py - Rectangle uygulaması
  • triangle.py - Triangle uygulaması
  • shapefactory.py - Şekiller oluşturmak için fabrika sınıfı

Her dosyada, uygulamana rehberlik edecek ayrıntılı TODO yorumları bulunuyor. Kodunun tüm gereksinimleri karşıladığından emin olmak için bu yorumları dikkatle izle.

Kendin dene

from shapefactory import ShapeFactory
from shape import Shape
from circle import Circle
from rectangle import Rectangle
from triangle import Triangle
import sys

# Test senaryosu yürütücüsü
test_case = input()

factory = ShapeFactory()

if test_case == "circle_area":
    circle = factory.create_shape("circle", 5)
    print(f"{circle.area():.2f}")

elif test_case == "rectangle_perimeter":
    rectangle = factory.create_shape("rectangle", 4, 6)
    print(f"{rectangle.perimeter()}")

elif test_case == "triangle_perimeter":
    triangle = factory.create_shape("triangle", 3, 4, 5)
    print(f"{triangle.perimeter()}")

elif test_case == "invalid_shape":
    try:
        factory.create_shape("hexagon", 6)
        print("No exception raised")
    except ValueError as e:
        print(str(e))

elif test_case == "case_insensitive":
    circle = factory.create_shape("CiRcLe", 3)
    print(f"{circle.area():.2f}")

elif test_case == "shape_inheritance":
    shapes = [
        factory.create_shape("circle", 2),
        factory.create_shape("rectangle", 2, 3),
        factory.create_shape("triangle", 3, 4, 5)
    ]
    all_shapes = all(isinstance(shape, Shape) for shape in shapes)
    print(all_shapes)

elif test_case == "zero_radius_circle":
    circle = factory.create_shape("circle", 0)
    print(f"{circle.area():.2f} {circle.perimeter():.2f}")

elif test_case == "negative_dimensions":
    rectangle = factory.create_shape("rectangle", -2, -3)
    print(f"{rectangle.area()}")

elif test_case == "large_values":
    circle = factory.create_shape("circle", 1000000)
    print(f"{circle.area():.2e}")

elif test_case == "polymorphism_test":
    shapes = [
        factory.create_shape("circle", 2),
        factory.create_shape("rectangle", 3, 4),
        factory.create_shape("triangle", 3, 4, 5)
    ]
    area_sum = sum(shape.area() for shape in shapes)
    perimeter_sum = sum(shape.perimeter() for shape in shapes)
    print(f"Area sum: {area_sum:.2f}, Perimeter sum: {perimeter_sum:.2f}")

elif test_case == "triangle_area":
    triangle = factory.create_shape("triangle", 3, 4, 5)
    print(f"{triangle.area():.2f}")

elif test_case == "method_override":
    circle = factory.create_shape("circle", 2)
    rectangle = factory.create_shape("rectangle", 3, 4)
    triangle = factory.create_shape("triangle", 3, 4, 5)
    
    # Uygulamaları karşılaştırmak için metot nesnelerini al
    circle_area = Circle.area
    rectangle_area = Rectangle.area
    triangle_area = Triangle.area
    
    circle_perimeter = Circle.perimeter
    rectangle_perimeter = Rectangle.perimeter
    triangle_perimeter = Triangle.perimeter
    
    # Tüm uygulamaların birbirinden farklı olup olmadığını kontrol et
    unique_areas = len({circle_area, rectangle_area, triangle_area}) == 3
    unique_perimeters = len({circle_perimeter, rectangle_perimeter, triangle_perimeter}) == 3
    
    if unique_areas and unique_perimeters:
        print("All shapes correctly override methods")
    else:
        print("Some shapes share method implementations")
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi