创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
1.工厂方法模式:(常用,需要掌握)
定义:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
本质:将对象的实例化封装在工厂类中,将对象的创建与使用分离。也就是说:是用工厂类的方法来代替 new 操作的。
工厂模式的优点
- 降低耦合度
- 对象的创建与使用分离,使用者无需关心创建对象的细节,符合单一职责原则。当对象的创建过程很复杂时这个优点会更加突出。
- 使代码更简洁,易维护
- 高质量的代码必须保证单个方法不要太长,因此要尽量将方法进行封装,易于维护。
-
工厂模式有如下几种写法:
简单工厂模式、工厂方法模式、抽象工厂模式。
1.1 简单工厂模式
定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
1.2 工厂方法模式
定义:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
1.3 抽象工厂模式
定义:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
抽象工厂:用来生产其他工厂的工厂。
区分
简单工厂 : 用来生产同一等级结构中的任意产品。(不支持拓展增加产品)
工厂方法 :用来生产同一等级结构中的固定产品。(支持拓展增加产品)
抽象工厂 :用来生产不同产品族的全部产品。
示例: BitmapFactory,ExecutorCallAdapterFactory,
3 单例模式(常用,需要掌握)
定义:确保一个类最多只有一个实例,并提供一个全局访问点
单例模式可以分为两种:预加载和懒加载
常见5种实现方式方式:懒汉式,饿汉式,静态内部类,双重校验锁,枚举
1)懒汉模式就是,它很懒,直到用到的时候才会去创建对象,而不是一开始就创建对象。
2)饿汉模式就是,它很饿,想快点创建对象,此模式在类加载时就立即创建对象。
3)静态内部类的单例写法是:在类内部有一个静态内部类,它持有外部类的实例。
4)双重校验锁:volatile作用:保证有序性、可见性。
第一次校验:也就是第一个if(singleton == null)
由于单例模式只要一次创建实例即可
第二次校验:也就是第二个if(singleton == null)
多线程场景下这个校验是防止二次创建实例
5)枚举
支持多线程
可保证只有一个实例。这与枚举类的实现有关。
支持防止反序列化和防止反射破坏单例
4.建造者模式(常用,需要掌握)
含义:将一个对象的构建过程与这个对象分离,使得可以很方便的用构建过程创建不同属性的对象。
定义:封装一个复杂对象构造过程,并允许按步骤构造。
定义解释: 我们可以将建造者模式理解为,假设我们有一个对象需要建立,这个对象是由多个组件(Component)组合而成,每个组件的建立都比较复杂,但运用组件来建立所需的对象非常简单,所以我们就可以将构建复杂组件的步骤与运用组件构建对象分离,使用builder模式可以建立。
安卓源码常见:Dialogue的Builder创建方式,Retrofit的Builder创建方式
5 原型模式(不常用,了解即可)
定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。
简单地理解,其实就是当需要创建一个指定的对象时,我们刚好有一个这样的对象,但是又不能直接使用,我会clone一个一毛一样的新对象来使用;基本上这就是原型模式。关键字:Clone。
5.1 深拷贝和浅拷贝
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的
适用场景:创建对象非常耗费资源,适用clone方式实现复制对象