设计模式:建造者模式
前言
来啦老铁!
笔者正在学习常见的设计模式,且将设计模式系列学习文章归入 “设计模式学习” 专题,赶快关注专题一起学习吧!
今天我们继续学习:
-
建造者模式
备注:笔者的学习资料大部分来源于:菜鸟教程;
学习路径
- 建造者模式简介;
- 建造者模式代码实现;
- 建造者模式优缺点分析;
- 建造者模式使用场景介绍;
1. 建造者模式简介;
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
-
意图:
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 -
主要解决:
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 -
何时使用:
一些基本部件不会变,而其组合经常变化的时候。 -
如何解决:
将变与不变分离开。 -
关键代码:
建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
2. 建造者模式代码实现;
我们以生产不同汽车为例,比如生产宝马汽车、奔驰汽车,宝马 1 系,宝马 7 系等。
1. 抽象汽车,创建汽车类 car.py;
class Car:
def __init__(self):
pass
def build_framework(self):
raise NotImplementedError()
def install_windows(self):
raise NotImplementedError()
def install_tires(self):
raise NotImplementedError()
def install_branding(self):
raise NotImplementedError()
def prize(self):
raise NotImplementedError()
2. 实现建造者;
- 宝马汽车建造者 bmwBuilder.py;
from car import Car
class BmwBuilder(Car):
def __init__(self):
super().__init__()
def build_framework(self):
print("Benz framework")
def install_windows(self):
print("Benz windows")
def install_tires(self):
print("Benz tires")
def install_branding(self):
print("Benz branding")
def prize(self):
print("The mean prize of BMW is 20w")
def create_bmw_1(self):
self.build_framework()
self.install_windows()
self.install_tires()
print("The prize of BMW 1 is 20w")
def create_bmw_7(self):
self.build_framework()
self.install_windows()
self.install_tires()
print("The prize of BMW 7 is 80w")
- 奔驰汽车建造者 benzeBuilder.py;
from car import Car
class BenzBuilder(Car):
def __init__(self):
super().__init__()
def build_framework(self):
print("Benz framework")
def install_windows(self):
print("Benz windows")
def install_tires(self):
print("Benz tires")
def install_branding(self):
print("Benz branding")
def prize(self):
print("The mean prize of Benz is 30w")
注意:在这里,我们为了演示实例的多样性,除了提供宝马汽车、奔驰汽车,还在宝马汽车内提供 1 系、7 系的实例;
- 创建指挥者 director.py
from bmwBuilder import BmwBuilder
from benzBuilder import BenzBuilder
class Director:
def __init__(self):
self.builder = None
def build(self):
[step() for step in
(self.builder.build_framework, self.builder.install_windows, self.builder.install_tires,
self.builder.install_branding, self.builder.prize)]
def build_bmw_1(self):
self.builder.create_bmw_1()
def build_bmw_7(self):
self.builder.create_bmw_7()
if __name__ == "__main__":
print("BMW:")
director = Director()
director.builder = BmwBuilder()
director.build()
print("--------------------")
print("BMW 1:")
director.build_bmw_1()
print("--------------------")
print("BMW 7:")
director.build_bmw_7()
print("--------------------")
print("Benz:")
director = Director()
director.builder = BenzBuilder()
director.build()
3. 运行 director.py;
我们会看到控制台打印出:
BMW:
Benz framework
Benz windows
Benz tires
Benz branding
The mean prize of BMW is 20w
BMW 1:
Benz framework
Benz windows
Benz tires
The prize of BMW 1 is 20w
BMW 7:
Benz framework
Benz windows
Benz tires
The prize of BMW 7 is 80w
Benz:
Benz framework
Benz windows
Benz tires
Benz branding
The mean prize of Benz is 30w
综上,使用建造者模式,我们可以指定建造者,由指挥者指挥建造者创建出指定的对象,当我们对宝马汽车未来有了拓展,例如宝马 10 系,则只需要创建新的建造者交由指挥者控制,这样就能达到易拓展的目的。
当然,如果内部变化很多,则需要很多建造者,也即需要很多建造者类,这也是这个模式的弊端~
3. 建造者模式优缺点分析;
-
优点:
- 建造者独立,易扩展;
- 便于控制细节风险;
-
缺点:
- 产品必须有共同点,范围有限制;
- 如内部变化复杂,会有很多的建造类;
4. 建造者模式使用场景介绍;
- 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐";
- JAVA 中的 StringBuilder;
好了,今天就简单学到这吧,我也将在工作中不断学习、实践该设计模式,有新的认知也会做更新,也欢迎读者指正,感谢~
如果本文对您有帮助,麻烦点赞、关注!
谢谢!