在 Java 开发中不得不品鉴的必然就是设计模式。虽然 Kotlin 中很多内容被精简了,但设计模式依然存在——哪怕是那些被精简的部分。因为工业工作区常用的这些设计模式实在是太完美了,它无论如何都一定有存在的意义,无法被缺省。

要从众多设计模式中挑选出一个我最喜欢的设计模式,这问题还是蛮艰难的。毕竟就算把范围缩小到 Java 常用的三大类也很难选择阿。我就从每个大类中挑选一个到两个我最喜欢的设计模式,然后解释一下为什么我会挑选出它吧。就从经典的创建模式开始。

说起创建模式,第一个想到的大概是工厂吧。嗯,没人喜欢抽象工厂,尤其是又臭又长的“接口,抽象,工厂,委派,实例”这一套“三剑客”时代思想。所以说阿,就算是狼,也不会喜欢写工厂的。当然不用工厂是不可能的。
创建模式中,当然还是构建者(Builder,又名构建生成器)最酷啦!构建者就像是一个装配器,然后只需要按照订单就能开始生产对象,很大程度来讲要比工厂更自由。话虽如此,如果构建者被公开了,那么有时候对象就会变得不可名状。该用工厂的话还是得用工厂吧。哎。

接下来应该是行为模式吧,那么一定是命令(Command)和模板(Template)啦。
这两个会放在一起,因为它们有个共同点:接口代替大脑,实现代替思考。采用同一套接口并且使用一种无特定定义的名词作为方法名,而其功能完全由对象名决定,非常符合面向对象编程哲学的同时又能保证代码刚性较弱,不会具有强针对性。尤其是命令,单一方法接口可以在 Java 中作为匿名方法进行 Lambda,这可是非常方便的!用模板和命令搭配构建者有奇效。

最后一个模式,是数据结构。这个里面也有两种我很喜欢的模式,不过其中一个已经在 Java 与 Kotlin 中被内置处理了——数据类(Record/Data class),在设计模式中称之为备忘录(Memento)。
在 Java 17 的更新中 Record 被正式加入,不过真得吐槽一下,Record 其实并不如备忘录或 Kotlin 的 Data class——因为它的数据不可变,仅用于记录定量形式的数据结构。因此在 Java 中,任何列式数据依旧得靠备忘录。 备忘录可以用于管理变量权限,减少对外暴露公开变量或直接交付变量指针(底层而言),因此备忘录并不能被直接暴露公开对象的类取代,这是一个很常见的新手误区。
当然,数据结构模式有两种我喜欢的,备忘录只是第一种,另一种是装饰器(Decorator)。通常情况下我在编写数据列表的时候会采用注册表(Register)与组合器(Composite)搭配构建者来处理数据。很显然,这样一次性就提到了三种设计模式,这不符合我在编程中“简单则是最好(K.I.S.S.)”原则。虽然大多情况下会比较必要,毕竟用注册表与组合器搭配能解决大部分问题并且减少对象管理混乱,这适用于数据量多到无法评估的情况——例如公开 API。对于内部设计,当然还是装饰器最好了。装饰器减少对象继承,它看起来和模板或者命令很像,这也是为什么我这么喜欢装饰器。装饰器连续处理数据并提交最终数据,这套原则与 Builder 非常相似,不过创建的对象也比 Builder 更多。那么有没有一种可能——用注册表与装饰器的组合也可以取代注册表与组合器?虽然并不是不可用,但管理起来就得享福了。除非真正意义上有这方面需求,否则还是老老实实适用组合器吧。