设计模式浅谈

设计模式

  • 1.代理模式proxy
    • 1.1动态代理
      • 1.1.1JDK动态代理
      • 1.1.2CGLIB动态代理
    • 1.2 使用场景
  • 2.单例模式singleton

1.代理模式proxy

	所谓的代理模式就是在原有的服务上加了一个占位,通过这个占位可以控制服务的访问和对一些功能的增强。可举例说明。

1.1动态代理

1.1.1JDK动态代理

/**接口*/
public interface HelloService{
     
public void sayHello(String name);
}
/**实现类*/
public class HelloServiceImpl implements HelloService{
     
@Override 
public void sayHello(String name){
     
	System.out.println("Hello "+name);
	}
}
/**代理类*/
public class HelloServiceProxy implements InvocationHandler{
     
	/**真实的服务对象*/
	private Object target;
	/**生成代理对象*/
	public Object bind(Object target){
     
		this.target=target;
		return Proxy.newProxyInstance(target.getClass.getClassLoader(),target.getClass().getInterface,this);
	}
	/**实现InvocationHandler接口的invoke方法*/
	public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
     
		Object result=null;
		//通过反射调用实现类的方法
		result=method.invoke(target,args);
		return result;
	}
}
/**测试类*/
public TestJdkProxy{
     
	public static void main(String[] args){
     
		HelloServiceProxy helloHandler=new HelloServiceProxy();
		HelloService proxy=(HelloService)helloHandler.bind(new HelloServiceImpl());
		proxy.sayHello("张三");
	}
}
	1.编写接口和实现类,jdk动态代理接口是必须要的
	2.编写代理类,实现InvocationHandler接口,实现bind方法生成代理对象bind(实现类对象target),Proxy.newProxyInstance(类加载器,
	接口,代理类this),实现invoke方法,通过反射调用实现类的方法。

1.1.2CGLIB动态代理

public class HelloServiceCglib implements MethodInterceptor{
     
	private Object target;
	/**创建代理对象*/
	public Object getInstance(){
     
		this.target=target;
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		//回调方法
		enhancer.serCallback(this);
		return enhancer.create();
	}
	@Override
	//回调方法
	public Object intercept(Object obj,Method method,Object[]args,MethodProxy proxy)throws Throwable{
     
		Object returnObj=proxy.invokeSuper(obj,args);
		return returnObj;
	}
}
	1.可以不需要提供接口,实现MethodInterceptor接口,getInstance()方法获取代理对象,实现intercept()方法,通过反射调用实现类的方法。

1.2 使用场景

	1.Mybatis的运行原理,mapper接口没有实现,通过动态代理实现接口,嵌套查询的懒加载是用的CGLIB动态代理。
	2.spring中的AOP底层也是动态代理。

2.单例模式singleton

	1.什么是单例模式?优点是什么?使用场景?
	所谓单例模式就是整个程序只有一个实例。
	优点:节约内存,减少频繁创建提高效率。
	使用场景:Mybatis中SqlSessionFactory对象,applicationContext等。
	2.常用的几种模式
	懒汉式,饿汉式,双重校验锁,静态内部类,枚举。
/**懒汉式
   如果不加synchronized,出现线程不安全创建多个实例,不是单例模式
*/
public class Singleton {
     

    private static Singleton instance = null;
    private Singleton(){
     }

    public static synchronized Singleton getInstance(){
     
        //如果还没有被实例化过,就实例化一个,然后返回
        if(instance == null){
     
            instance = new Singleton();
        }
        return instance;
    }
}
/**饿汉式*/
public class Singleton {
     
    //类加载的时候instance就已经指向了一个实例
    private static Singleton instance = new Singleton();
    private Singleton(){
     }

    public static Singleton getInstance(){
     
        return instance;
    }
}
/**双重校验锁*/
public class Singleton {
     
    private static Singleton instance = null;
    private Singleton(){
     }

    public static Singleton getInstance(){
     
        if(instance == null){
     
            synchronized (Singleton.class){
     
                if(instance == null){
     
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
/**静态内部类*/
public class Singleton {
     

    private static class SingletonHolder{
     
        private static Singleton instance = new Singleton();
    }

    private Singleton(){
     }

    public static Singleton getInstance(){
     
        return SingletonHolder.instance;
    }
}
/**枚举*/
public enum Singleton {
     
    INSTANCE;
}

你可能感兴趣的:(设计模式)