设计模式 - 单例模式
1.单例模式:为什么要使用单例模式?
Singleton模式保证产生单一实例,就是说一个类只产生一个实例。使用singleton有两个原因:
只有一个实例,可以减少实例频繁创建和销毁所带来的资源消耗----------性能需求
多个用户使用这个实例的时候,便于统一控制(比如打印机对象)--------功能需求
1.2 单例方法1:饿汉模式
public class Singleton1{
private Singleton1(){ } // 构造函数私有化,不允许外部构造对象,
private static Singleton1 intance1=new Singleton1(); //饿汉模式:立即创建私有对象
public static Singleton1 getInstance(){ return intance1;} //对外部提供统一访问接口,获取实例。
}
1.3 单例方法2:懒汉模式
public class Singleton2{
private Singleton2(){ }
private static Singleton2 instance=null;
public static synchronized Singleton2 getInstance(){ //懒汉模式
if(instance==null){ instance=new Singleton2(); } //如果没有方法上的synchronized ,多线程同时判断intance==null,导致创建多实例。
return instance;
}
}
评估:方法上的synchronized 导致,每次进入都要获得锁,这个锁的范围比较大,对性能有损耗。
1.4 单例方法3:同步锁模式
public class Singleton3{
private Object internalLockObj=new Object();
private Singleton3(){ }
private static Singleton3 instance=null;
public static Singleton3 getInstance(){ //懒汉模式
synchronized(internalLockObj){
if(instance==null){ instance=new Singleton3(); } //减小锁范围,提升性能
}
return instance;
}
}
1.5 单例方法3:显式加锁模式
public class Singleton4{
private Lock lock=new ReentrantLock();
private Singleton4(){ }
private static Singleton4 instance=null;
public static Singleton4 getInstance(){
lock.lock();
try{
if(instance==null){ instance=new Singleton4(); } //减小锁范围,提升性能
return instance;
}catch(Exception e){
throw new RuntimeException(e);
}finally{
lock.unlock();
}
}
}
2.适配器模式:Adapter模式
2.1要解决的问题:接口转换
具体类已经有实现的功能,但是访问接口,不能被目标接口直接使用。
通过适配器将具体类功能适配到目标接口。接口转换。
2.2适配方式:类适配/对象适配
类的适配器
类适配器:继承的方式实现适配。继承--强耦合
代码示例:(Sortable和ArrayList不兼容,定义一个NewSortable)
public class SortableList extends ArrayList implements Sortable{
public T getElement(int i){ return get(i);}
public void setElement(int i,T o){ set(i,o);}
}
public interface NewSortable<T>{
int size();
T getElement(int i);
void setElement(int i,T o);
}
对象的适配器
对象适配器:组合方式实现适配。优选组合,少用继承
代码示例:
public class SortableList<T> implements Sortable<T>{
private final List<T> list;
public SortableList(List<T> list){ this.list=list;}
public int size(){ return list.size();}
public T get(int i){ return list.get(i);}
public void set(int i,T o){ list.set(i,o);}
}
2.3适配器应用:
JDBC Driver
是对具体数据库的适配器---Oracle适配到JDBC中
JDBC-ODBC Bridge:
是将Windows ODBC适配到JDBC接口中
评论