导航
在本章中,分别提出了6个建议。 1.用creation method代替构造函数 2.把创建知识搬移到factory中 3.用factory封装类 4.用factory method引入多态创建 5.用build封装composite 6.内联singleton
用creation method代替构造函数
因为在java中,构造函数和类名相同。而且还能多态。 构造函数过多,则需要用参数进行区分不同的功能。这种方式会让人迷惑。 用一个简单的static函数包装下原本的构造函数,能极大的消除创建迷惑。真是太棒了。
把创建知识搬移到factory中
创建漫延指,创建一个对象的代码和数据重复出现在了多个地方。此时管理起来就不方便了。 简单的factory把创建对象的过程和数据封装在了一个类对象中。此时,客户端都唯一与这个factory通信。降低耦合。 最重要的是,factory应包含创建过程中不需要客户端操心的数据。这才符合工厂模式的精髓。客户只管付钱,而不是提供原材料。 通常,简单工厂就能满足需要,但如果工厂中有太多的switch,可以考虑将工厂升级为抽象工厂。 factory容易被滥用,因为factory仅仅是一组creation method的集合。当能用new解决问题之时,不要轻易重构为factory。
用factory封装类
有时,可以把构造函数设为私有。这其实是强推factory的一种方式。客户端就没有办法随意的new实例了。
用factory method引入多态创建
所谓factory method,就是创建实例的函数。比如createXX之类的。它最强大的地方在于可以创建不同类型的实例。这一点与creation method不同。
通常情况下,一个factory method是一个抽象函数,具体实现在子类实现。它通常和模版模式一起使用。 具体上,长这样:
代码语言:javascript复制template:
class BaseDo(object):
def run():
builder = create_builder()
# do sth to builder
class Do1(BaseDo):
def create_builder():
# do sth
return builder
task = Do1()
task.run()
run 的实现从各子类被解耦,因为它的唯一不同在于builder。
用build封装composite
有时,一个composite的实现不是那么的可爱。比如系统自带的高度抽象的xml包。
此时,可以在它的上面再加一层封装。即用builder代码来替换原生代码。
将抽象的add
, .parent
方法替换成具体的addChild
,使用户在调用时关注于实现而不是细节。
内联Singleton
所有的全局变量,在未证明无害时,都是有害。 当一个单例,仅在一个类中调用。那就没有必要保留全局的入口。这个建议实质是消除全局变量。 具体的方法,内部类,protect修饰符千奇百怪的解决方案。