第三章 自由扩展你的项目–Builder 模式
Builder 模式的定义
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder 模式的使用场景
-
相同的方法,不同的执行顺序,产生不同的事件结果时
-
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
-
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适
-
初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时
Builder 模式的 UML 类图
Product
:产品的抽象类Builder
:抽象 Builder 类,规范产品的组建,一般是由子类实现具体的组建过程ConcreteBuilder
:具体的 Builder 类Director
:统一组装过程。
Builder 模式总结
-
Builder 模式在 Android 开发中也较为常用,通常作为配置类的构建器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免过多的 setter 方法。
-
Builder 模式比较常见的实现形式是通过调用链实现,这样使得代码更简洁、易懂,避免了目标类中被过多的接口“污染”。
-
优点
- 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节
- 建造者独立,容易扩展
-
缺点
- 会产生多余的 Builder 对象以及 Director 对象,消耗内存
第四章 使程序运行更高效–原型模式
原型模式的定义
- 用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象
原型模式的使用场景
-
类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型复制避免这些消耗
-
通过new 产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式
-
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式复制多个对象供调用者使用,即保护性拷贝
原型模式的 UML 类图
Client
:客户端用户。Prototype
:抽象类或者接口,声明具备 clone 能力ConcretePrototype
:具体的原型类。
原型模式小结
-
使用原型模式可以解决构建复杂对象的资源消耗问题,能够在某些场景下提升创建对象的效率。
-
还有一个重要的用途就是保护性拷贝,也就是某个对象对外可能是只读的,为了防止外部对这个只读对象修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。
-
优点
- 原型模式是在内存中二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。
-
缺点
- 这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发当中应该注意这个潜在的问题。优点就是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。