设计模式分为创建型、结构型和行为型。
创建型(5种):需要new一个对象出来。包括:单利模式、工厂模式、抽象工厂模式、原型模式、创建者模式。
1、单利模式
在内存中只有一个实例,常用于工具方法,缓存,读取配置文件等操作,或者占用内存比较大的对象。
有5种:
- 饿汉式
- 懒汉式(懒加载)
- 双重检查
- 静态内部类
- 枚举
饿汉式
线程安全,但是不能懒加载。会造成内存浪费
原理:虚拟机在类加载阶段会初始化静态变量,并保证该过程的线程安全。所以静态变量instance只会被初始化一次。(instance实例的创建放在静态代码块中也可以)
懒汉式
1)在调用时在创建实例对象。缺点是线程不安全。不推荐
2)安全式的懒汉式
不推荐,每次调用都会先获取锁,性能低下。
双重锁校验
线程安全,懒加载,性能高,推荐使用。注意:instance使用volatile修改时为了防止指令重排。
static class Sington {
private Sington(){}
private static volatile Sington instance ;
public static Sington getInstance(){
if (instance == null){
synchronized (Sington.class){
if (instance == null) {
instance = new Sington();
}
}
}
return instance;
};
}
静态内部类
原理:类Sington在装载时,静态内部类不会被装载,只有在调用getInstance时,才会被加载,又由于静态变量INSTANCE在类加载时会被创建,并且由虚拟机保证线程安全。
所以该种方法具有懒加载、线程安全的优点,推荐使用。
static class Sington {
private Sington(){}
private static class SingtonInstance {
private static Sington INSTANCE = new Sington();
}
public static Sington getInstance(){
return SingtonInstance.INSTANCE;
}
}
枚举实现单利
枚举线程安全,还可以防止反序列化修改。推荐使用
enum Sington {
INSTANCE;
public void doSomething(){};
}
```java
单利模式在JDK中的使用Runtime
## 2、简单工厂模式
一个接口有多个子类,工厂模式按照一定的条件,将类的创建延迟到了子类中。
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=5a0fe56ac956400dbf4d6eb3bef8f729.png?,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfMjA4NDY3Njk=,size_20,color_FFFFFF,t_70,g_se,x_16)
## 3、抽象工厂
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。有一个抽象工厂用于根据不同的场景创建不同的工厂,各个工厂再按照自己工厂(一个接口)的要求去生产。
场景:在一个产品族里面,定义多个产品。比如时装有男装、女装。男装又有夏装和秋冬装;女装也有夏装和秋冬装。我们使用男装工厂去生产男装的夏装和秋冬装。使用女装工厂去生产女装的衣服。
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=50ed8201b921450999d351acefe1ed41.png?,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcXFfMjA4NDY3Njk=,size_20,color_FFFFFF,t_70,g_se,x_16)
jdk中的Calendar使用的是工厂模式
## 4、原型模式
用于创建重复的对象,同时又能保证性能,当直接创建对象的代价比较大时,则采用这种模式。
场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。3、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。4、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
## 5、建造者模式
使用多个简单的对象一步一步构建成一个复杂的对象。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
JDK中的StringBuilder使用该模式。
构建校验规则的时候,可以有1条,2条,3条规则....