From 1d201b3a651ef31240f207f02db81d6cb0eee9b4 Mon Sep 17 00:00:00 2001 From: Luke Plant Date: Wed, 31 Jan 2018 20:36:05 +0300 Subject: [PATCH] Made builder pattern much simpler by removing unnecessary classes. This follows the motto "a class with only one method that actually does anything should be a function", with the result that using the director function requires one line of code instead of 5. --- creational/builder.py | 31 +++++++++---------------------- tests/test_builder.py | 12 +++--------- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/creational/builder.py b/creational/builder.py index 71e3b12f..2c642d7a 100644 --- a/creational/builder.py +++ b/creational/builder.py @@ -10,10 +10,10 @@ from its actual representation (generally for abstraction). *What does this example do? -This particular example uses a Director to abtract the +This particular example uses a director function to abtract the construction of a building. The user specifies a Builder (House or Flat) and the director specifies the methods in the order necessary -creating a different building dependding on the specified +creating a different building depending on the specified specification (through the Builder class). @author: Diogenes Augusto Fernandes Herminio @@ -29,19 +29,11 @@ """ -# Director -class Director(object): - - def __init__(self): - self.builder = None - - def construct_building(self): - self.builder.new_building() - self.builder.build_floor() - self.builder.build_size() - - def get_building(self): - return self.builder.building +def construct_building(builder): + builder.new_building() + builder.build_floor() + builder.build_size() + return builder.building # Abstract Builder @@ -93,14 +85,9 @@ def __repr__(self): # Client if __name__ == "__main__": - director = Director() - director.builder = BuilderHouse() - director.construct_building() - building = director.get_building() + building = construct_building(BuilderHouse()) print(building) - director.builder = BuilderFlat() - director.construct_building() - building = director.get_building() + building = construct_building(BuilderFlat()) print(building) ### OUTPUT ### diff --git a/tests/test_builder.py b/tests/test_builder.py index 17aeba68..533c11c9 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -1,16 +1,13 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- import unittest -from creational.builder import Director, BuilderHouse, BuilderFlat +from creational.builder import construct_building, BuilderHouse, BuilderFlat class TestHouseBuilding(unittest.TestCase): def setUp(self): - self.director = Director() - self.director.builder = BuilderHouse() - self.director.construct_building() - self.building = self.director.get_building() + self.building = construct_building(BuilderHouse()) def test_house_size(self): self.assertEqual(self.building.size, 'Big') @@ -22,10 +19,7 @@ def test_num_floor_in_house(self): class TestFlatBuilding(unittest.TestCase): def setUp(self): - self.director = Director() - self.director.builder = BuilderFlat() - self.director.construct_building() - self.building = self.director.get_building() + self.building = construct_building(BuilderFlat()) def test_house_size(self): self.assertEqual(self.building.size, 'Small')