zoukankan      html  css  js  c++  java
  • 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;     

           }

    }

  • 相关阅读:
    常用编码格式算法
    js显示当前时间
    客户端和服务器端乱码问题
    常用的小技巧
    开发jsp中常用标签
    java中的反射
    java中的单例设计模式
    java中的枚举类
    关于继承时构造方法的问题
    TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?
  • 原文地址:https://www.cnblogs.com/superjishere/p/11803247.html
Copyright © 2011-2022 走看看