创建 ## 导航 在本章中,分别提出了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是一个抽象函数,具体实现在子类实现。它通常和模版模式一起使用。 具体上,长这样: ``` 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修饰符千奇百怪的解决方案。 来自 大脸猫 写于 2018-03-05 15:01 -- 更新于2020-10-19 13:06 -- 0 条评论