From df77f2aa4679790bfa1d6052511f592e6e14b939 Mon Sep 17 00:00:00 2001 From: Alice Wang Date: Sat, 29 Jul 2017 17:22:50 +0200 Subject: [PATCH 1/2] add implementation of abstract factory --- creational/abstract_factory.py | 40 ++++++++++++++++++++++++++++++---- tests/test_abstract_factory.py | 11 +++++++++- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/creational/abstract_factory.py b/creational/abstract_factory.py index 223322c33..23bca7338 100644 --- a/creational/abstract_factory.py +++ b/creational/abstract_factory.py @@ -4,7 +4,8 @@ # http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/ """Implementation of the abstract factory pattern""" - +import six +import abc import random @@ -72,6 +73,31 @@ def get_factory(): return random.choice([DogFactory, CatFactory])() +# Implementation 2 of an abstract factory +@six.add_metaclass(abc.ABCMeta) +class Pet(object): + + @classmethod + def from_name(cls, name): + for sub_cls in cls.__subclasses__(): + if name == sub_cls.__name__.lower(): + return sub_cls() + + @abc.abstractmethod + def speak(self): + """""" + + +class Kitty(Pet): + def speak(self): + return "Miao" + + +class Duck(Pet): + def speak(self): + return "Quak" + + # Show pets with various factories if __name__ == "__main__": for i in range(3): @@ -79,10 +105,14 @@ def get_factory(): shop.show_pet() print("=" * 20) + for name0 in ["kitty", "duck"]: + pet = Pet.from_name(name0) + print("{}: {}".format(name0, pet.speak())) + ### OUTPUT ### -# We have a lovely Dog -# It says woof -# We also have dog food +# We have a lovely Cat +# It says meow +# We also have cat food # ==================== # We have a lovely Dog # It says woof @@ -92,3 +122,5 @@ def get_factory(): # It says meow # We also have cat food # ==================== +# kitty: Miao +# duck: Quak diff --git a/tests/test_abstract_factory.py b/tests/test_abstract_factory.py index d18b4a838..8ad0838e8 100644 --- a/tests/test_abstract_factory.py +++ b/tests/test_abstract_factory.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- import unittest from creational.abstract_factory import PetShop,\ - Dog, Cat, DogFactory, CatFactory + Dog, Cat, DogFactory, CatFactory, Pet try: from unittest.mock import patch except ImportError: @@ -54,3 +54,12 @@ def test_dog_shall_woof(cls): def test_dog_shall_be_printable(cls): cls.assertEqual(str(cls.d), 'Dog') + + +class PetTest(unittest.TestCase): + + def test_from_name(self): + test_cases = [("kitty", "Miao"), ("duck", "Quak")] + for name, expected_speech in test_cases: + pet = Pet.from_name(name) + self.assertEqual(pet.speak(), expected_speech) From 8883b271e823a7ebb1184815c4a0aafc712ea065 Mon Sep 17 00:00:00 2001 From: Alice Wang Date: Sat, 29 Jul 2017 17:27:46 +0200 Subject: [PATCH 2/2] update one requirement --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fd8619f94..b16e1f661 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ cache: - pip install: - - travis_retry pip install -q coveralls codecov + - travis_retry pip install -q coveralls codecov six - pip install flake8 # eventually worth script: