设计模式 - 单例模式

用户头像
张荣召
关注
发布于: 2020 年 10 月 01 日

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接口中



用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
设计模式-单例模式