Commit a30a0200 authored by arjun.b's avatar arjun.b

abstract factory and builder implementation in fastapi

parent f03e3f23
......@@ -2,9 +2,11 @@ import uvicorn
from fastapi import FastAPI
from scripts.logging.logging import logger
from scripts.services.area import shape
from scripts.services.meals import meals
app = FastAPI()
app.include_router(shape)
app.include_router(meals)
if __name__ == "__main__":
try:
uvicorn.run(app, port=8765)
......
class EndPoints:
circle_area = "/circle_area"
rectangle_area = "/rectangle_area"
meals_maker = "/meal"
from abc import ABC, abstractmethod
# Product class that we want to build with the builder pattern
class Meal:
def __init__(self):
self.drink = None
self.payasam = None
self.side = None
self.dessert = None
def __repr__(self):
return f"Meal(drink={self.drink}, payasam={self.payasam}, side={self.side}, dessert={self.dessert})"
# Abstract builder interface
class MealBuilder(ABC):
@abstractmethod
def add_drink(self):
pass
@abstractmethod
def add_payasam(self):
pass
@abstractmethod
def add_side(self):
pass
@abstractmethod
def add_dessert(self):
pass
@abstractmethod
def get_meal(self):
pass
# Concrete builder that builds a combo meal
class ComboMealBuilder(MealBuilder):
def __init__(self):
self.meal = Meal()
def add_drink(self):
self.meal.drink = "Thumbs UP"
def add_payasam(self):
self.meal.payasam = "Pradaman"
def add_side(self):
self.meal.side = "Fries"
def add_dessert(self):
self.meal.dessert = "Apple pie"
def get_meal(self):
return self.meal
# Director class that uses the builder to build the meal
class MealAssembler:
def __init__(self, builder: MealBuilder):
self.builder = builder
def assemble_meal(self):
self.builder.add_drink()
self.builder.add_payasam()
self.builder.add_side()
self.builder.add_dessert()
return self.builder.get_meal()
......@@ -5,6 +5,7 @@ from scripts.core.handlers.shape_handler import CircleFactory, AreaCalculator, R
shape = APIRouter()
# CREATIONAL PATTERN -ABSTRACT FACTORY METHOD
# Register endpoints that use the abstract factory
@shape.get(EndPoints.circle_area, tags=["Area of a Circle"])
async def circle_area(radius: float):
......
from fastapi import APIRouter
from scripts.constants.endpoints import EndPoints
from scripts.core.handlers.meals_builder import ComboMealBuilder, MealAssembler
meals = APIRouter()
# CREATIONAL PATTERN BUILDER METHOD
# Register endpoint that uses the builder to build a meal
@meals.get(EndPoints.meals_maker, tags=["meals"])
async def get_meal():
builder = ComboMealBuilder()
meal_assembler = MealAssembler(builder)
meal = meal_assembler.assemble_meal()
return {"meal": str(meal)}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment