设计模式(建造者模式)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 设计模式(建造者模式)

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

建造者模式

1、内容

将一个复杂对象的构建与它表示分离,使得同样的构建过程可以创建不同的表示

2、角色

  • 抽象建造者
  • 具体建造者
  • 指挥者
  • 产品
  • 建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。

    3、优点

  • 隐藏了一个产品的内部结构和装配过程
  • 将构造代码与表示代码分开
  • 可以将构建过程进行更精细的控制
  • 4、缺点

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
  • 5、使用场景

  • 当创建复杂对象的算法(Director)应该独立于该对象的组成部分以及它们的装配方式(Builder)时
  • 当构造过程允许被构造的对象有不同的表示时(不同Builder)
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。 
  • 6、代码示例

    
    import random
    from abc import abstractmethod, ABCMeta
    
    #------产品------
    
    class Player:
        def __init__(self, face=None, body=None, arm=None, leg=None):
            self.face = face
            self.arm = arm
            self.leg = leg
            self.body = body
    
        def __str__(self):
            return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)
    
    
    #------建造者------
    
    
    class PlayerBuilder(metaclass=ABCMeta):
        @abstractmethod
        def build_face(self):
            pass
        @abstractmethod
        def build_arm(self):
            pass
        @abstractmethod
        def build_leg(self):
            pass
        @abstractmethod
        def build_body(self):
            pass
        @abstractmethod
        def get_player(self):
            pass
    
    
    class BeautifulWomanBuilder(PlayerBuilder):
        def __init__(self):
            self.player = Player()
        def build_face(self):
            self.player.face = "漂亮脸蛋"
        def build_arm(self):
            self.player.arm="细胳膊"
        def build_body(self):
            self.player.body="细腰"
        def build_leg(self):
            self.player.leg="长腿"
        def get_player(self):
            return self.player
    
    class RandomPlayerBuilder(PlayerBuilder):
        def __init__(self):
            self.player = Player()
        def build_face(self):
            self.player.face = random.choice(["瓜子脸","西瓜子脸"])
        def build_arm(self):
            self.player.arm=random.choice(["长胳膊","短胳膊"])
        def build_body(self):
            self.player.body=random.choice(["苗条","胖"])
        def build_leg(self):
            self.player.leg=random.choice(["长腿","短腿"])
        def get_player(self):
            return self.player
    
    class PlayerDirector:
        def __init__(self, builder):
            self.builder = builder
        # 控制组装顺序
        def build_player(self):
            self.builder.build_body()
            self.builder.build_face()
            self.builder.build_arm()
            self.builder.build_leg()
            return self.builder.get_player()
    
    pd = PlayerDirector(RandomPlayerBuilder())
    p = pd.build_player()
    print(p)
    
    设计模式(建造者模式)

    识别图中二维码,欢迎关注python宝典

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 设计模式(建造者模式)


     上一篇
    设计模式(工厂模式) 设计模式(工厂模式)
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 一、什么是设计模式每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。” 每
    2021-04-05
    下一篇 
    设计模式(单例模式) 设计模式(单例模式)
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 单例模式1、内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 2、角色 单例 3、使用场景 当类只有一个实例而且客户可
    2021-04-05