------------------创建模式
一、工厂
1、简单工厂
通过工厂类的方法获得对象
2、工厂方法
一个工厂的多个工厂子类,每个子类生产自己的产品。用户可以通过选择工厂来获得不同的产品。
3、抽象工厂
当产品维度复杂化时,需要将产品的共性、工厂的共性提取出,抽象成接口。比如海尔工厂包括海尔冰箱生产和海尔电视生产,海信工厂包括海信冰箱生产和海信电视生产。冰箱包括海信冰箱和海尔冰箱。用户只关心,工厂接口、产品接口。
好处:用户不关心细节,使用起来更简便。提供方隐藏细节,修改、增加其中的方法更简便(扩展性、可维护性)。
二、单例模式
饿汉式、懒汉式、双重检查、静态内部类
三、建造者模式
1、创建一个抽象builder类,子类可以构建不同对象,影藏构造细节
2、在一个复杂对象需要设定参数的情况,可以构建一个内部类builder来用于参数设定,使用链式调用。
四、原型模式
1.浅克隆 object.clone().返回的对象需要做cloneable标识
2.深克隆 通过stream的方式读写
------------------------结构型模式
一、代理模式
1、静态代理
代理类的构造函数需要传入被代理类的实例,在代理类的代理方法内调用目标方法,并增强。
2、JDK动态代理
使用反射包下的Proxy类的getInstance方法,动态生成带*$的类,也能对目标方法进行增强。
生成的类为Proxy的子类,可以通过运行时字节码反编译看到这个类。
原理:在类加载时,类资源可以从本地字节码文件中获取,也可以从运行时计算生成。JVM规范对此不强制要求。
3、cglib动态代理
底层采用ASM框架字节码生成技术。代理类继承被代理类。不能对声明为final的类进行代理。
如果当前类没有实现接口,只能用cglib动态代理。
代理模式可以保护目标对象,不让用户直接操作目标对象。解耦合。