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).
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"))[{"id": 1, "name": "Ann"}, {"id": 2, "name": "Bob"}]
1,Ann
2,BobSadə 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.
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