博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例设计模式
阅读量:6971 次
发布时间:2019-06-27

本文共 3886 字,大约阅读时间需要 12 分钟。

一:单例设计模式的定义

单例设计模式,顾名思义,就是在整个程序运行过程中,只向外界提供一个对象,这样做可以避免资源的浪费,例如

我们打开回收站或者ppt时,只会启动一个窗口。

单例模式的java实现:

1:饿汉式

1 /** 2  *  3  */ 4 package com.hlcui.singleton; 5  6 /** 7  * @author Administrator 饿汉式单例类 8  */ 9 public class SingletonDemo {10     // 1:内部创建一个对象11     private static SingletonDemo single = new SingletonDemo();12 13     // 2:私有化构造方法14     private SingletonDemo() {15 16     }17 18     // 3:对外界提供一个方法,获取SingletonDemo对象19     public static SingletonDemo getInstance() {20         return single;21     }22 }

 

2:懒汉式

1 /** 2  *  3  */ 4 package com.hlcui.singleton; 5  6 /** 7  * @author Administrator 懒汉式单例类 8  *  9  */10 public class SingletonDemo2 {11     // 1:内部创建对象的引用12     private static SingletonDemo2 single;13 14     // 2:私有化构造方法15     private SingletonDemo2() {16 17     }18 19     // 3:对外提供一个方法,获取对象,只是要进行判断20     public static SingletonDemo2 getInstance() {21         if (single == null) {22             single = new SingletonDemo2();23         }24         return single;25     }26 }

3:懒汉式与饿汉式比较

 

两种不同实现方式的区别:

<1> 从资源利用的角度看,懒汉式是在调用其静态方法的时候才被实例化的,所以要比饿汉式稍好一些。  

<2> 从反映时间和速度上看,饿汉式在类加载的时候就得到了初始化,所以要比懒汉式好一些。

由上可见,创建一个单子类必须满足以下三个条件:

1.构造器私有

2.自己持有自身的一个静态引用

3.对外面系统提供访问唯一实例的公共静态接口(方法).

 

二:案例分析

1:单例代码

1 /** 2  *  3  */ 4 package com.hlcui.singleton; 5  6 import java.awt.Rectangle; 7 import java.awt.event.ActionEvent; 8 import java.awt.event.ActionListener; 9 10 import javax.swing.JButton;11 import javax.swing.JFrame;12 import javax.swing.JLabel;13 14 /**15  * @author Administrator16  * 17  */18 public class DemoSingleton extends JFrame {19     /**20      * 21      */22     private static final long serialVersionUID = 1L;23     // 一个私有的,静态的本类对象24     private static DemoSingleton testFrame = new DemoSingleton();25     JLabel jLMes = new JLabel();26 27     // 构造必须是私有的,这样其它的类才不能访问28     private DemoSingleton() {29         getContentPane().setLayout(null);30         this.getContentPane().add(jLMes);31         this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);32         jLMes.setText("这是产生的唯一窗体");33         jLMes.setBounds(new Rectangle(103, 53, 230, 96));34     }35 36     // 公有的静态方法返回一个本类对象37     public static synchronized DemoSingleton getInstance() {38         return testFrame;39     }40 41 }

2:测试代码

1 /** 2  *  3  */ 4 package com.hlcui.singleton; 5  6 import java.awt.Rectangle; 7 import java.awt.event.ActionEvent; 8 import java.awt.event.ActionListener; 9 10 import javax.swing.JButton;11 import javax.swing.JFrame;12 13 /**14  * @author Administrator15  *16  */17 class Test extends JFrame {18        JButton jBtn = new JButton();19      20        public Test() {21           getContentPane().setLayout(null);22           jBtn.setBounds(new Rectangle(125, 182, 168, 43));23           jBtn.setText("单击产生唯一窗体");24      25           this.jBtn.addActionListener(new MyActionListener());26           this.getContentPane().add(jBtn);27           this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);28           this.setSize(500, 300);29           this.setVisible(true);30        }31      32        class MyActionListener implements ActionListener {33           // 单击按钮时调用单子模式类的静态方法,获得一个对象34           public void actionPerformed(ActionEvent e) {35              DemoSingleton testFrame = DemoSingleton.getInstance();36              testFrame.setSize(300, 200);37              testFrame.setVisible(true);38      39           }40        }41      42        public static void main(String[] args) {43      44           Test test = new Test();45        }46 }

3:运行效果

 

三:懒汉式与饿汉式的理解

1:懒汉式

比较懒,就是什么时候用,什么时候建立这个对象

private SingleDemo(){};

private static  SingleDemo single = null;

public static synchronized getInstantce(){

  if(single == null){

    single == new SingleDemo();

  }

  return single;

}

2:饿汉式

确实比较饿,就是不管用不用,先建立对象再说

private SingleDemo(){};

private static  SingleDemo single = new SingleDemo();;

public static synchronized getInstantce(){

  return single;

}

 

转载地址:http://leasl.baihongyu.com/

你可能感兴趣的文章
Eclipse优化集合,Eclipse优化速度,解决Ctrl+C、Ctrl+V卡
查看>>
JavaScript中的this基本问题<转>
查看>>
杭电2040亲和数
查看>>
深入剖析Tomcat(How Tomcat Works)
查看>>
通过月份得到本月有几天周末
查看>>
在PHP语言中使用JSON和将json还原成数组
查看>>
博客园非官方月刊-2014年12月刊
查看>>
电商仓储控制超卖的策略
查看>>
windows系统安装MongoDB
查看>>
[转]Peer-to-Peer Communication Across Network Address Translators
查看>>
C++临时变量的生命周期
查看>>
Remove Element
查看>>
高淇Struts2.0教程之视频笔记(7)
查看>>
自适应SimpsonSimpson积分
查看>>
初学WebGL引擎-BabylonJS:第2篇-基础模型体验
查看>>
Python的垃圾回收机制以及引用计数
查看>>
C语言经典实例1: 类型长度与类型转换
查看>>
用DateTime.ToString(string format)输出不同格式的日期
查看>>
[转July]KMP算法(mark)
查看>>
mysql获取表列信息、主键信息
查看>>