71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: Builder
 | 
						|
---
 | 
						|
 | 
						|
The builder is a design pattern that could abstract and decouple the creation of a very complex object.
 | 
						|
 | 
						|
## Builder in Python
 | 
						|
Here is an example of Builder Pattern implementation in Python3.
 | 
						|
 | 
						|
 | 
						|
```python
 | 
						|
# Builder
 | 
						|
class CourseBuilder(object):
 | 
						|
    def __init__(self, teacher):
 | 
						|
        self.teacher = teacher
 | 
						|
 | 
						|
    def build_course(self):
 | 
						|
        self.teacher.provide_homework()
 | 
						|
        self.teacher.provide_exam()
 | 
						|
        return self.teacher.course
 | 
						|
 | 
						|
# Teacher
 | 
						|
class Teacher(object):
 | 
						|
    def __init__(self, name=None):
 | 
						|
        self.name = name
 | 
						|
        self.course = Course()
 | 
						|
 | 
						|
    def provide_homework(self):
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    def provide_exam(self):
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
 | 
						|
class MathTeacher(Teacher):
 | 
						|
    def provide_homework(self):
 | 
						|
        self.course.homework = 'This is Math homework provided by {}.'.format(self.name)
 | 
						|
 | 
						|
    def provide_exam(self):
 | 
						|
        self.course.exam = 'This is Math exam tested by {}.'.format(self.name)
 | 
						|
 | 
						|
 | 
						|
class HistoryTeacher(Teacher):
 | 
						|
    def provide_homework(self):
 | 
						|
        self.course.homework = 'This is History homework provided by {}.'.format(self.name)
 | 
						|
 | 
						|
    def provide_exam(self):
 | 
						|
        self.course.exam = 'This is History exam tested by {}.'.format(self.name)
 | 
						|
 | 
						|
 | 
						|
# Target objects to be produced
 | 
						|
class Course(object):
 | 
						|
    def __init__(self):
 | 
						|
        self.homework = None
 | 
						|
        self.exam = None
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        return 'Homework: {}\nExam: {}\n'.format(self.homework, self.exam)
 | 
						|
 | 
						|
 | 
						|
math_course = CourseBuilder(MathTeacher('Harry')).build_course()
 | 
						|
print(math_course)
 | 
						|
>>> Homework: This is Math homework provided by Harry.
 | 
						|
>>> Exam: This is Math exam tested by Harry.
 | 
						|
 | 
						|
history_course = CourseBuilder(HistoryTeacher('Potter')).build_course()
 | 
						|
print(history_course)
 | 
						|
>>> Homework: This is History homework provided by Potter.
 | 
						|
>>> Exam: This is History exam tested by Potter.
 | 
						|
```
 |