构建器方法 - Python设计模式
Builder Method 是一种创建设计模式,旨在“将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。”它允许您逐步构建复杂的对象。在这里使用相同的构造代码,我们可以轻松地生成对象的不同类型和表示。
它基本上旨在为面向对象编程中各种对象创建问题的解决方案提供灵活性。
Builder设计模式UML图
不使用 Builder 方法的问题:
想象一下,您想加入 GeeksforGeeks 的精英批次之一。因此,您将去那里询问费用结构、可用时间以及您想参加的课程的批次。在查看系统后,他们会告诉您课程、费用结构、可用时间和批次。就是这样! (不!我们还没有完成,因为我们是优秀的开发人员)。
我们的主要目的是设计灵活、可靠、有组织和润滑的系统。没有经验的开发人员会做的是,他们将为GeeksforGeeks提供的每门课程创建一个单独且独特的课程。然后他们将为每个类创建单独的对象实例化,尽管并非每次都需要。当 GeeksforGeeks 开始新课程并且开发人员也必须添加新课程时,主要问题就会出现,因为他们的代码不太灵活。
注意:以下代码是在不使用 Builder 方法的情况下编写的。
Python3
# concrete course
class DSA():
"""Class for Data Structures and Algorithms"""
def Fee(self):
self.fee = 8000
def available_batches(self):
self.batches = 5
def __str__(self):
return "DSA"
# concrete course
class SDE():
"""Class for Software development Engineer"""
def Fee(self):
self.fee = 10000
def available_batches(self):
self.batches = 4
def __str__(self):
return "SDE"
# concrete course
class STL():
"""class for Standard Template Library of C++"""
def Fee(self):
self.fee = 5000
def available_batches(self):
self.batches = 7
def __str__(self):
return "STL"
# main method
if __name__ == "__main__":
sde = SDE() # object for SDE
dsa = DSA() # object for DSA
stl = STL() # object for STL
print(f'Name of Course: {sde} and its Fee: {sde.fee}')
print(f'Name of Course: {stl} and its Fee: {stl.fee}')
print(f'Name of Course: {dsa} and its Fee: {dsa.fee}')
Python3
# Abstract course
class Course:
def __init__(self):
self.Fee()
self.available_batches()
def Fee(self):
raise NotImplementedError
def available_batches(self):
raise NotImplementedError
def __repr__(self):
return 'Fee : {0.fee} | Batches Available : {0.batches}'.format(self)
# concrete course
class DSA(Course):
"""Class for Data Structures and Algorithms"""
def Fee(self):
self.fee = 8000
def available_batches(self):
self.batches = 5
def __str__(self):
return "DSA"
# concrete course
class SDE(Course):
"""Class for Software Development Engineer"""
def Fee(self):
self.fee = 10000
def available_batches(self):
self.batches = 4
def __str__(self):
return "SDE"
# concrete course
class STL(Course):
"""Class for Standard Template Library"""
def Fee(self):
self.fee = 5000
def available_batches(self):
self.batches = 7
def __str__(self):
return "STL"
# Complex Course
class ComplexCourse:
def __repr__(self):
return 'Fee : {0.fee} | available_batches: {0.batches}'.format(self)
# Complex course
class Complexcourse(ComplexCourse):
def Fee(self):
self.fee = 7000
def available_batches(self):
self.batches = 6
# construct course
def construct_course(cls):
course = cls()
course.Fee()
course.available_batches()
return course # return the course object
# main method
if __name__ == "__main__":
dsa = DSA() # object for DSA course
sde = SDE() # object for SDE course
stl = STL() # object for STL course
complex_course = construct_course(Complexcourse)
print(complex_course)
Builder方法的解决方案:
我们的最终产品应该是 GeeksforGeeks 的任何课程。它可能是 SDE、STL 或 DSA。在选择特定课程之前,我们必须经过许多步骤,例如查找有关课程、教学大纲、费用结构、时间安排和批次的详细信息。在这里使用相同的过程,我们可以选择GeeksforGeeks提供的不同课程。这就是使用构建器模式的好处。
Python3
# Abstract course
class Course:
def __init__(self):
self.Fee()
self.available_batches()
def Fee(self):
raise NotImplementedError
def available_batches(self):
raise NotImplementedError
def __repr__(self):
return 'Fee : {0.fee} | Batches Available : {0.batches}'.format(self)
# concrete course
class DSA(Course):
"""Class for Data Structures and Algorithms"""
def Fee(self):
self.fee = 8000
def available_batches(self):
self.batches = 5
def __str__(self):
return "DSA"
# concrete course
class SDE(Course):
"""Class for Software Development Engineer"""
def Fee(self):
self.fee = 10000
def available_batches(self):
self.batches = 4
def __str__(self):
return "SDE"
# concrete course
class STL(Course):
"""Class for Standard Template Library"""
def Fee(self):
self.fee = 5000
def available_batches(self):
self.batches = 7
def __str__(self):
return "STL"
# Complex Course
class ComplexCourse:
def __repr__(self):
return 'Fee : {0.fee} | available_batches: {0.batches}'.format(self)
# Complex course
class Complexcourse(ComplexCourse):
def Fee(self):
self.fee = 7000
def available_batches(self):
self.batches = 6
# construct course
def construct_course(cls):
course = cls()
course.Fee()
course.available_batches()
return course # return the course object
# main method
if __name__ == "__main__":
dsa = DSA() # object for DSA course
sde = SDE() # object for SDE course
stl = STL() # object for STL course
complex_course = construct_course(Complexcourse)
print(complex_course)
构建器模式方法的通用类图:
使用 Builder 方法的优点:
- 可重用性:在制作产品的各种表示时,我们也可以将相同的构造代码用于其他表示。
- 单一职责原则:我们可以将业务逻辑和复杂的构建代码相互分离。
- 对象的构造:这里我们一步一步构造我们的对象,延迟构造步骤或递归运行步骤。
使用Builder方法的缺点:
- 代码复杂度增加:我们的代码复杂度增加,因为构建器模式需要创建多个新类。
- 可变性:它要求构建器类是可变的
- 初始化:类的数据成员不保证被初始化。
适用性:
- 构建复杂对象: Builder 方法允许您逐步构建产品。甚至,我们可以在不破坏最终产品的情况下推迟某些步骤的执行。要创建对象树,递归调用这些步骤很方便。它可以防止客户端代码获取不完整的数据,因为它不允许暴露未完成的对象。
- 表示不同:构建器模式适用于产品的各种表示的构建涉及仅在细节上有所不同的相似步骤。基本构建器接口用于定义所有构建步骤,而这些步骤由具体构建器实现。
进一步阅读: C++ 中的构建器设计方法