创建型模式
一、单例模式
1.饿汉式
私有构造,不允许创建对象
在静态方法中获取静态成员变量的实例,保证单例
反射破坏单例:
判断上面的静态变量如果不为空,就不允许私有构造去创建对象,
反序列化破坏单例
在对象中重写反序列化的方法:readObject(),让其返回当前单例,即可解决;
unsafe,jdk自带的方法(无法解决)
通过unsafe方法可以通过类型创建实例,也不会走构造方法。
2.枚举饿汉式(类加载就有静态)
枚举的每一个项,都是一个实例,定义一个,就是单例
3.懒汉式(会有线程安全问题)
将静态变量的赋值放在静态方法中,同时在方法上判断,静态变量是否为空,保证单例
4.DCL懒汉式单例(double check lock)
在进入方法前和进入方法后都判断成员变量是否为空,也是在加锁前后判断,解决了线程安全问题;
成员变量上要加volatile,解决共享变量的可见性和有序性(指令顺序), 无法解决原子性。
5.内部类懒汉式
给静态变量赋值,相当于在静态代码块中执行,由java虚拟机保证同步性,所以我们有了内部类的懒汉式。
二.抽象工厂模式(工厂模式),
抽象工厂模式的目的是提供一个标准化的接口,用于创建一系列相互关联的产品,这些产品可以应用于不同的场景。
隐藏具体产品的实现细节,将客户端与具体产品(具体类)的耦合降到最低,从而提高系统的灵活性、可扩展性和可维护性。
1.抽象工厂(类)
包含了一系列用于创建产品对象的方法,这些产品对象属于不同的类别或者不同的产品族。
2.具体工厂
是抽象工厂的实现类,用于创建特定的产品对象,每个具体工厂只生产特定产品族的产品对象。
3.抽象产品
4,具体产品
三、工厂方法模式
概念:
工厂方法模式通过定义一个抽象工厂接口,并让其子类来实现所需对象的创建,从而将对象实例的创建过程委托给工厂子类。
创建对象的具体实现被封装在工厂类中,客户端无需知道具体实现类的名称,对具体实现类的依赖性降低,从而提高系统的灵活性和可扩展性。此外,工厂方法模式也便于单元测试和代码重构。
抽象工厂
工厂接口
具体工厂
抽象产品
具体产品
抽象工厂模式(创建多种产品)和工厂方法(创建同一种产品)模式有什么区别
1.抽象工厂模式针对一种产品,而工厂方法模式针对一个产品的不同等级。
2.抽象工厂模式更加抽象和灵活,可以方便地增加新的产品。
3.抽象工厂模式的客户端更加简单,但扩展性较差。
四、原型模式
它通过复制(克隆)现有对象来创建新的对象实例。
使用原型模式的主要优势在于可以避免重复地执行对象实例的初始化操作,节省内存空间以及提高对象创建的性能。此外,原型模式也封装了对象的创建过程,隐藏了其具体实现细节,提高了系统的灵活性和可扩展性。
1.深克隆
1.通过JSON的序列化和反序列化,
String json = JSON.toJSONString(this); //将源对象转化为JSON字符串
return JSON.parseObject(json,Person.class);
2.浅克隆
1.要求实现Cloneable标识性接口(标记该类的对象可以被clone)
2.重写Object 中clone方法
五、构建者模式
它将复杂对象的构建过程与其表示分离。通过将复杂对象的构造过程分解为多个简单对象的构造步骤,然后按步骤顺序进行穿插组装,从而视图得到一个复杂对象。
指导者(Director)
控制构建过程
构建者(Builder)
负责构建过程
可以简化复杂对象的创建过程,将其分解为多个简单的步骤;
对象的构建过程可以嵌套,不同的构建者可以互相配合;
提供了良好的封装性,每个构建者只需要关注自己的构建部分;
支持更加灵活的参数配置,可以根据需要灵活地调整参数。