享元模式 Flyweight Pattern
2020-03-08
享元模式与其说是一种设计模式,不如说是一种算法思想。将可以共享的对象存储在一个表中以节省内存,而不是每次都重新创建。 例如,Java 中的 Integer 类型对 -128 到 127 的值做了缓存,java.lang.Integer#valueOf(int) 会直接返回缓存的对象。String 则可以保存在常量池中。这些都是典型应用。 …
外观模式 Facade Pattern
2020-03-07
将一个系统划分为若干子系统,有利于降低系统的复杂性,但是会使客户端的调用复杂化。 外观模式将这些子系统封装到一个类中,对客户端屏蔽这些子系统,提供一个高层、简单的接口。这也是我们不自觉就使用过的设计模式,只不过以前可能不知道名字而已。 …
桥接模式 Bridge Pattern
2020-03-06
当一个抽象可以有多个实现时,通常用继承来协调它们。 例如,对于表示形状的抽象类,可以有圆形、矩形等具体实现,但使用的绘图 API 实现可以不同,如果为每种形状类再定义各种 API 的版本,不仅复杂,而且抽象与实现绑定在一起,不能在运行时改变。 …
适配器模式 Adapter Pattern
2020-03-04
假设现有一个旧接口,客户端希望使用一种新接口的形式调用它,此时可以利用适配器模式,将旧接口以新接口的形式进行封装。不过如果适配器使用过多,则整个系统会显得混乱,因此最好只在希望避免修改原有代码时使用。 …
使用 Rclone 管理云存储
2020-02-01
在没有图形界面的服务器上,或不想使用客户端软件时,如何方便地管理云存储是个问题。 Rclone 就是为此而生的,它可以方便在命令行下挂载网盘,例如 Google Drive、Dropbox、OneDrive 等,还支持 Amazon S3 对象存储服务。 …
生成器模式 Builder Pattern
2020-01-29
在设计类时,如果包含或将来可能会包含很多属性,就要重载很多构造方法,不仅设计参数麻烦,调用也比较混乱。 为此可以使用 getter、setter 来逐步构造,但这样构造就分为很多步骤,但这可能会产生其它问题,比如维护者看到一部分代码会认为对象已经构造完毕,而实际上并非如此,使用未完全构造的对象就可能出错。另外这种方法也无法处理 final 字段。 …
策略模式 Strategy Pattern
2020-01-27
在软件开发中,某一功能可以有多种实现,如果把这些实现都放在一个类中,则不利于增加、修改和替换,此时可以把可能频繁变化的逻辑抽象出来,Runnable 就采用了类似的思想。这种设计模式叫策略模式: …
移植 Samba 到 iOS 平台
2019-09-08
前言 iOS 越狱后可以像树莓派那样作为迷你服务器,在上面搭建 aria2、Transmission 等。但是 Cydia 上的 Samba 非常古老,而且只能在 32 位 CPU 上运行。 于是我开始寻找替代方案: …