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 ...@@ -2,9 +2,11 @@ import uvicorn
from fastapi import FastAPI from fastapi import FastAPI
from scripts.logging.logging import logger from scripts.logging.logging import logger
from scripts.services.area import shape from scripts.services.area import shape
from scripts.services.meals import meals
app = FastAPI() app = FastAPI()
app.include_router(shape) app.include_router(shape)
app.include_router(meals)
if __name__ == "__main__": if __name__ == "__main__":
try: try:
uvicorn.run(app, port=8765) uvicorn.run(app, port=8765)
......
class EndPoints: class EndPoints:
circle_area = "/circle_area" circle_area = "/circle_area"
rectangle_area = "/rectangle_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 ...@@ -5,6 +5,7 @@ from scripts.core.handlers.shape_handler import CircleFactory, AreaCalculator, R
shape = APIRouter() shape = APIRouter()
# CREATIONAL PATTERN -ABSTRACT FACTORY METHOD
# Register endpoints that use the abstract factory # Register endpoints that use the abstract factory
@shape.get(EndPoints.circle_area, tags=["Area of a Circle"]) @shape.get(EndPoints.circle_area, tags=["Area of a Circle"])
async def circle_area(radius: float): 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