设计模式:生成器模式(Builder pattern)
优化前的代码
创建对象是我们工作中极其普遍的事。比如以下代码:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论