什么是设计模式?常⽤的设计模式有哪些?设计模式就是经过前⼈⽆数次的实践总结出的,设计过程中可以反复使⽤的、可以解决特定问题的设计⽅法。
单例(饱汉模式、饥汉模式)
1、构造⽅法私有化,让出了⾃⼰类中能创建外其他地⽅都不能创建
2、在⾃⼰的类中创建⼀个单实例(饱汉模式是⼀出来就创建创建单实例,⽽饥汉模式需要的时候才创建)
3、提供⼀个⽅法获取该实例对象(创建时需要进⾏⽅法同步)
⼯⼚模式:Spring IOC就是使⽤了⼯⼚模式.
对象的创建交给⼀个⼯⼚去创建。
代理模式:Spring AOP就是使⽤的动态代理。
单例设计模式精讲
定义:保证⼀个类只有⼀个实例,并且提供⼀个全局访问点
场景:线程池,数据库连接池
实现⽅式:  1.懒汉模式(只有使⽤的时候,再进⾏初始化,延迟加载)
      2.饿汉模式
      3.静态内部类
      4.反射攻击
      6.序列化
      7.jdk源码
1.懒汉模式实现的写法
public class SingletonTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
LazySingleton lazySingleton = Instance();
System.out.println(lazySingleton);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
LazySingleton lazySingleton = Instance();
System.out.println(lazySingleton);
}
}).start();
//两个线程打印出来的线程实例是同⼀个,说明是单例
}
}
//使⽤的时候才开始实例化,JVM中⼀个实例
class LazySingleton {
private volatile static LazySingleton instance;
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
private LazySingleton() {
}
}
2.饿汉模式
在类加载阶段完成了实例的初始化,通过类加载机制来保证线程的安全
类的加载过程
1加载=》加载对应的⼆进制⽂件,并且在⽅法区创建对应的数据结构
连接:a.验证  b.准备  c.解析
初始化:给静态属性赋值
public class HungrySingletonTest {
public static void main(String[] args) {
HungrySingleton hungrySingleton = Instance();
}
}
class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance() {
return instance;
}
private HungrySingleton() { }
}
3.基于静态内部类的单例
public class AntiTest {
public static void main(String[] args) throws NoSuchMethodException,IllegalAccessException, InvocationTargetException, InstantiationException{        InnerClassSingleton instance = Instance();
System.out.println(instance);
//抛出异常,单例,不允许有多个实例
Constructor<InnerClassSingleton>  declaredConstructor  = DeclaredConstructor();
java单例模式懒汉和饿汉declaredConstructor.setAccessible(true);
InnerClassSingleton innerClassSingleton = wInstance();
System.out.println(innerClassSingleton);
}
}
class InnerClassSingleton{
static class InnerClass{
private static InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance(){
return InnerClass.instance;
}
private InnerClassSingleton(){
if ((InnerClass.instance!=null)){
throw new RuntimeException("单例类,不允许多个实例!");
}
}
}
4.枚举单例
public class EnumSingletonTest{
public static void main(String[] args) {
EnumSingleton instance = EnumSingleton.INSTANCE;
EnumSingleton instance1 = EnumSingleton.INSTANCE;
System.out.println(instance==instance1);//true
instance.print();//        149928006
instance1.print();//        149928006
}
}
enum EnumSingleton {
INSTANCE;
public void print(){
System.out.println(this.hashCode());
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。