1.什么是设计模式?
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结.
2.设计模式的作用是什么?
使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
3.常见的设计模式
常见的设计模式有23种。
3.1单例模式
单例模式---保证一个类仅有一个实例。
当类被频繁地创建与销毁的时候,我们使用单例模式,这样可以减少了内存的开销,避免对资源的多重占用。
单例模式条件:
1.构造方法私有
2.提供一个静态方法【公共】返回创建好的当前类对象
两种表示方式
懒汉式[先定义,后创建]
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
package com.wangxing.shejimoshi1;
/**
* 单例模式---保证当前类只有一个对象
* 懒汉式:【先定义,后创建】
* 是否延迟初始化:是
* 是否多线程安全:否
* 这种方式 延迟加载很明显。
*/
public class Singleton {
//定义当前类的对象
private static Singleton singletonobj=null;
//私有的构造方法,造成这个类的对象不能在其他类中new
private Singleton(){}
//这个静态方法可以让我们在其他类中得到这个类的对象
public static synchronized Singleton getSingleton(){
if(singletonobj==null){
singletonobj=new Singleton();
}
return singletonobj;
}
}
饿汉式[在所有之前就已经创建成功]
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
package com.wangxing.shejimoshi1;
/**
* 单例模式---保证当前类只有一个对象
* 饿汉式:[在运行之前就已经创建成功]
* 是否延迟初始化:否
* 是否多线程安全:是
* 这种方式比较常用,但容易产生垃圾对象。
*/
public class Singleton2 {
private static Singleton2 singleton2Obj=new Singleton2();
private Singleton2(){}
public static Singleton2 getSingleton2(){
return singleton2Obj;
}
}
懒汉式与饿汉式的区别:
1.从对资源的利用率角度看,懒汉式优于饿汉式
2.从程序的运行速度角度看,饿汉式优于懒汉式
3.2工厂模式
工厂模式----有一个专门的java类充当生产对象的工厂。
使用工厂模式的条件:
1.需求量大
2.牵一发,动全身
工厂模式中的角色:
工厂角色---生产对象
抽象产品角色---【抽象类/接口】
具体产品---【抽象类/接口子类】
例如:有农场生产各种水果,有西瓜,有苹果,有香蕉......
工厂角色---农场
抽象产品角色---水果
西瓜,苹果,香蕉----具体产品
3.3代理模式
代理模式---为其他对象提供一种代理以控制对这个对象的访问。
买火车票不一定在火车站买,也可以去代售点。
代理模式被分为静态代理和动态代理
静态代理有被分为兄弟模式和父子模式
缺点:需要额外提供业务功能实现相似的子类。【工作量大】
兄弟模式--同一个接口的两个子类
只能为实现过某个接口的java类提供代理类对象】
CGlib代理-------CGlib是一个第三发的开发包,用的时候需要自己事先下载导入到项目中
【所有的java类提供代理类对象】
比较:
1.静态代理是通过在代码中显式定义一个业务实现类一个代理,在代理类中对同名的业务方法进行包装,用户通过代理类调用被包装过的业务方法;
手动创建一个与目标类相同接口的子类,包装目标类。
2.JDK动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法;【兄弟模式】
通过jdk提供的反射包中Proxy这个类,动态的创建一个与目标类实现相同接口的子类对象,包装目标。
3.CGlib动态代理是通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理。【父子模式】
通过CGlib提供的Enhancer这个类,动态的创建一个目标类的子类对象,包装目标类。