设计模式学习

设计模式:建造者模式

2022-03-02  本文已影响0人  狄仁杰666

前言

来啦老铁!

笔者正在学习常见的设计模式,且将设计模式系列学习文章归入 “设计模式学习” 专题,赶快关注专题一起学习吧!

今天我们继续学习:

备注:笔者的学习资料大部分来源于:菜鸟教程

学习路径

  1. 建造者模式简介;
  2. 建造者模式代码实现;
  3. 建造者模式优缺点分析;
  4. 建造者模式使用场景介绍;

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. 实现建造者;

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")

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 系的实例;

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. 建造者模式优缺点分析;

  1. 建造者独立,易扩展;
  2. 便于控制细节风险;
  1. 产品必须有共同点,范围有限制;
  2. 如内部变化复杂,会有很多的建造类;

4. 建造者模式使用场景介绍;

  1. 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐";
  2. JAVA 中的 StringBuilder;
好了,今天就简单学到这吧,我也将在工作中不断学习、实践该设计模式,有新的认知也会做更新,也欢迎读者指正,感谢~

如果本文对您有帮助,麻烦点赞、关注!

谢谢!

上一篇 下一篇

猜你喜欢

热点阅读