设计模式:生成器模式(Builder pattern)

发布于 2024-12-15 14:19:21 字数 3253 浏览 5 评论 0

优化前的代码

创建对象是我们工作中极其普遍的事。比如以下代码:

class Address:

    def __init__(self, zip, street):
        self.zip = zip
        self.street = street

    def __repr__(self):
        return f'Address(zip={self.zip}, street={self.street})'


class User:

    def __init__(self, name, age, phone, address):
        self.name = name
        self.age = age
        self.phone = phone
        self.address = address

    def __repr__(self):
        return f'User(name={self.name}, age={self.age}, \
phone={self.phone}, address={self.address})'


user_1 = User('Jason', None, None, None)
print(user_1)

user_2 = User('Jason', 25, None, None)
print(user_2)

user_3 = User('Jason', 25, None, Address('310000', '杭州下城'))
print(user_3)

以上这样的代码,可以算是司空见惯的了,这即可能是我们自己写的代码,也可能是我们同事写的代码。正因为创建一个对象实在是太普遍了,所以也导致了我们对这样的工作没有进行过多的考虑。但是回过头再来看我们上面的代码,比如类似 User('Jason', None, None, None) 这样的对象构造方法,对于构造一个简单对象当然没有问题,但是一旦我们需要构造一个复杂对象,我们构造方法的参数就会变得很长,且无法表现出每个参数的具体含义。这样的代码可读性不高,也显得代码不够简洁。

优化后的代码

下面我们采用生成器模式来优化以上的代码:

class Address:

    def __init__(self, zip, street):
        self.zip = zip
        self.street = street

    def __repr__(self):
        return f'Address(zip={self.zip}, street={self.street})'


class User:

    def __init__(self, name, age, phone, address):
        self.name = name
        self.age = age
        self.phone = phone
        self.address = address

    def __repr__(self):
        return f'User(name={self.name}, age={self.age}, \
phone={self.phone}, address={self.address})'


class UserBuilder:

    def __init__(self, name):
        self.user = User(name, None, None, None)

    def setAge(self, age):
        self.user.age = age
        return self

    def setPhone(self, phone):
        self.user.phone = phone
        return self

    def setAddress(self, address):
        self.user.address = address
        return self

    def build(self):
        return self.user


user_1 = UserBuilder('Jason').build()
print(user_1)

user_2 = UserBuilder('Jason').setAge(25).build()
print(user_2)

user_3 = UserBuilder('Jason') \
       .setAge(25) \
       .setAddress(Address('310000', '杭州下城')) \
       .build()
print(user_3)

现在我们的代码,可读性得到了很好的提高,代码结构也显得更加清晰。

针对 Python 的额外优化

因为我使用的是 Python 语言作为代码演示,而对于 Python 而言,我们可以不需要创建额外的构造器对象 UserBuilder ,直接利用关键字参数和字典的 get() 方法来进一步简化代码:

class Address:

    def __init__(self, zip, street):
        self.zip = zip
        self.street = street

    def __repr__(self):
        return f'Address(zip={self.zip}, street={self.street})'


class User:

    def __init__(self, name, **kwargs):
        self.name = name
        self.age = kwargs.get('age')
        self.phone = kwargs.get('phone')
        self.address = kwargs.get('address')

    def __repr__(self):
        return f'User(name={self.name}, age={self.age}, \
phone={self.phone}, address={self.address})'


user_1 = User('Json')
print(user_1)

user_2 = User('Json', age=25)
print(user_2)

user_3 = User('Json', age=25, address=Address('310000', '杭州下城'))
print(user_3)

参考链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

幸福%小乖

暂无简介

文章
评论
25 人气
更多

推荐作者

qq_Azmtwvzn

文章 0 评论 0

james0422

文章 0 评论 0

郭乐意

文章 0 评论 0

始于初秋

文章 0 评论 0

青春如此纠结

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文