Java——单例模式初步

 

1.7 单例模式初步

好书推荐:java与模式

1.7.1 什么是设计模式

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索。设计模式是可以重复利用的解决方案,设计模式的提出是在1995 人,是由4 为作者提出的,称为GoF,也就是“四人组”。共23种设计模式。

1.7.2 单例(Singleton)设计模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

设计模式从结构上分为三类:创建型、结构性、行为型。

其中最简单的设计模式就是单例了,单例这种模式,尽量少用,也有将其称为“反模式”,缺点是单例模式的类型无法被继承。

单例模式有什么好处

我们知道对象实例创建完成后,会放到堆中,如果堆中的实例过多,将会存在特别多的

垃圾,这样会导致一些问题,如内存溢出等,使用单例模式后,只会创建一个实例,显著减

少对象实例的个数,同时也会提高性能,因为不会频繁的创建对象,这只是他的一个好处,

其他方面项目中再说。总之,为了保证JVM中某一个类型的java对象永远只有一个,为了节省内存的开销。

单例模式的三要素

>在类体中需要具有静态的私有的本类型的变量

>构造方法必须是私有的

>提供一个公共的静态的入口点方法

实现单例模式的两种方式

饿汉式单例:在类加载阶段就创建了对象。

懒汉式单例:用到对象的时候才会创建对象。

public class Singleton{ //懒汉式单例

       //静态变量

       private static Singleton s;

      

       //将构造方法私有化

       private Singleton(){}

      

       //对外提供一个公开获取Singleton对象的方法.

       public static Singleton getInstance(){

             

              if(s==null){ //可能存在线程安全问题的!

                     s = new Singleton();

              }

              return s;

       }

}

public class Customer{ //饿汉式单例模式

       //类加载时只执行一次。

       private static Customer c = new Customer();

       //构造方法私有化

       private Customer(){}

       //提供公开的方法

       public static Customer getInstance(){

              return c;

       }

}

public class Test01{//测试

       public static void main(String[] arg){

              /*

              Singleton s1 = new Singleton();

              Singleton s2 = new Singleton();

              System.out.println(s1==s2);

              */

              Singleton s1 = Singleton.getInstance();

              Singleton s2 = Singleton.getInstance();

              Singleton s3 = Singleton.getInstance();

             

              System.out.println(s1==s2);

              System.out.println(s2==s3);

       }

}

其他饿汉式举例

//饿汉式1

class Bank{

       //1.私有化构造器

       private Bank(){}

       //2.创建类的对象,同时设置为private的,通过公共的来调用,体现封装性

       //4.要求此对象也为static

       private static Bank instance = new Bank();

       //3.此公共的方法,必须为static

       public static Bank getInstance(){

              return instance;     

       }

}

//饿汉式2

class Bank{

       //1.私有化构造器

       private Bank(){}

       //2.创建类的对象,同时设置为private的,通过公共的来调用,体现封装性

       //4.要求此对象也为static

       private static Bank instance = null;

       static{

              instance  = new Bank();      

       }

       //3.此公共的方法,必须为static

       public static Bank getInstance(){

              return instance;     

       }

}

 

posted @ 2019-11-06 09:35  阿江是个程序猿  阅读(315)  评论(0编辑  收藏  举报