JsonExporter() ilə obyekt yaratmaq kodu konkret sinfə bağlayır. Yaradıcı pattern-lər "hansı sinif və necə?" qərarını bir yerə köçürür ki, müştərilər yalnız interfeysdən asılı olsun. Bu dərsdə sadə fabrik, Factory Method, Abstract Factory və onların Python üslublu yazılışı var.

Problem: böyüyən if zənciri

Hər yeni format export funksiyasını dəyişir, hər çağıran budaqlanmanı təkrarlayır. Funksiya formatın seçimini və həyata keçirilməsini qarışdırır (bax: OCP).

python
import json

def export(rows, fmt):
    if fmt == "json":
        return json.dumps(rows)
    elif fmt == "csv":
        return "\n".join(",".join(str(v) for v in r.values()) for r in rows)
    raise ValueError(f"unknown format: {fmt}")

rows = [{"id": 1, "name": "Ann"}, {"id": 2, "name": "Bob"}]
print(export(rows, "json"))
print(export(rows, "csv"))
text
[{"id": 1, "name": "Ann"}, {"id": 2, "name": "Bob"}]
1,Ann
2,Bob

Sadə fabrik

Hər formatı eyni dump metoduna malik sinif edin, adı sinfə isə bir funksiya çevirsin. Lüğət if zəncirini əvəz edir, naməlum ad bir aydın xəta verir. Bu GoF pattern-i deyil, lakin real hallarda çoxunu həll edir.

python
import json

class JsonExporter:
    def dump(self, rows): return json.dumps(rows)

class CsvExporter:
    def dump(self, rows):
        return "\n".join(",".join(str(v) for v in r.values()) for r in rows)

def make_exporter(fmt):
    exporters = {"json": JsonExporter, "csv": CsvExporter}
    try:
        return exporters[fmt]()
    except KeyError:
        raise ValueError(f"unknown format: {fmt}") from None