From 62e1b4239d56662cdab121c9e0887b1e2beac6f3 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Aug 2021 15:12:18 -0400 Subject: [PATCH 1/3] Apply factory method to data --- app/data/__init__.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/data/__init__.py b/app/data/__init__.py index 60a75dac..429178de 100644 --- a/app/data/__init__.py +++ b/app/data/__init__.py @@ -1,16 +1,33 @@ """app.data""" +from ..services.location import LocationService from ..services.location.csbs import CSBSLocationService from ..services.location.jhu import JhuLocationService from ..services.location.nyt import NYTLocationService -# Mapping of services to data-sources. +class dataSourceFactory(): + def getDataSource(): + return LocationService() + +class JhuFactory(dataSourceFactory): + def getDataSource(): + return JhuLocationService() + +class CSBSFactory(dataSourceFactory): + def getDataSource(): + return CSBSLocationService() + +class NYTFactory(dataSourceFactory): + def getDataSource(): + return NYTLcationService() + + +# Mapping of factories to data-sources. DATA_SOURCES = { - "jhu": JhuLocationService(), - "csbs": CSBSLocationService(), - "nyt": NYTLocationService(), + "jhu": JhuFactory(), + "csbs": CSBSFactory(), + "nyt": NYTFactory(), } - def data_source(source): """ Retrieves the provided data-source service. @@ -18,4 +35,4 @@ def data_source(source): :returns: The service. :rtype: LocationService """ - return DATA_SOURCES.get(source.lower()) + return DATA_SOURCES.get(source.lower()).getDataSource() From 8426e97c3642dc4c3ce9e8baf6922785a70a9265 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Aug 2021 15:17:30 -0400 Subject: [PATCH 2/3] Fix a typo --- app/data/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/__init__.py b/app/data/__init__.py index 429178de..4089417f 100644 --- a/app/data/__init__.py +++ b/app/data/__init__.py @@ -18,7 +18,7 @@ def getDataSource(): class NYTFactory(dataSourceFactory): def getDataSource(): - return NYTLcationService() + return NYTLocationService() # Mapping of factories to data-sources. From 96e5c9ffb73a625ffb773060de6cff700582278b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Aug 2021 17:12:45 -0400 Subject: [PATCH 3/3] Apply singleton pattern to data source --- app/data/__init__.py | 105 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/app/data/__init__.py b/app/data/__init__.py index 4089417f..42cab8f2 100644 --- a/app/data/__init__.py +++ b/app/data/__init__.py @@ -1,31 +1,102 @@ """app.data""" -from ..services.location import LocationService +from abc import ABC, abstractmethod from ..services.location.csbs import CSBSLocationService from ..services.location.jhu import JhuLocationService from ..services.location.nyt import NYTLocationService -class dataSourceFactory(): - def getDataSource(): - return LocationService() +class DataSourceFactory(ABC): + def __init__(self): + pass + + @abstractmethod + def getInstance(): + pass -class JhuFactory(dataSourceFactory): - def getDataSource(): - return JhuLocationService() + @abstractmethod + def getService(): + pass -class CSBSFactory(dataSourceFactory): - def getDataSource(): - return CSBSLocationService() +class JhuFactory(DataSourceFactory): + __instance = None + __service = None -class NYTFactory(dataSourceFactory): - def getDataSource(): - return NYTLocationService() + def __init__(self): + if JhuFactory.__instance != None: + raise Exception("Factory is singleton!") + elif JhuFactory.__service != None: + raise Exception("Service is singleton!") + else: + JhuFactory.__instance = self + JhuFactory.__service = JhuLocationService() + + @staticmethod + def getInstance(): + if JhuFactory.__instance == None: + JhuFactory() + return JhuFactory.__instance + + @staticmethod + def getService(): + if JhuFactory.__service == None: + JhuFactory() + return JhuFactory.__service + +class CSBSFactory(DataSourceFactory): + __instance = None + __service = None + + def __init__(self): + if CSBSFactory.__instance != None: + raise Exception("Factory is singleton!") + elif CSBSFactory.__service != None: + raise Exception("Service is singleton!") + else: + CSBSFactory.__instance = self + CSBSFactory.__service = CSBSLocationService() + + @staticmethod + def getInstance(): + if CSBSFactory.__instance == None: + CSBSFactory() + return CSBSFactory.__instance + + @staticmethod + def getService(): + if CSBSFactory.__service == None: + CSBSFactory() + return CSBSFactory.__service + +class NYTFactory(DataSourceFactory): + __instance = None + __service = None + + def __init__(self): + if NYTFactory.__instance != None: + raise Exception("Factory is singleton!") + elif NYTFactory.__service != None: + raise Exception("Service is singleton!") + else: + NYTFactory.__instance = self + NYTFactory.__service = NYTLocationService() + + @staticmethod + def getInstance(): + if NYTFactory.__instance == None: + NYTFactory() + return NYTFactory.__instance + + @staticmethod + def getService(): + if NYTFactory.__service == None: + NYTFactory() + return NYTFactory.__service # Mapping of factories to data-sources. DATA_SOURCES = { - "jhu": JhuFactory(), - "csbs": CSBSFactory(), - "nyt": NYTFactory(), + "jhu": JhuFactory.getInstance(), + "csbs": CSBSFactory.getInstance(), + "nyt": NYTFactory.getInstance(), } def data_source(source): @@ -35,4 +106,4 @@ def data_source(source): :returns: The service. :rtype: LocationService """ - return DATA_SOURCES.get(source.lower()).getDataSource() + return DATA_SOURCES.get(source.lower()).getService()