单例设计模式

一:单例设计模式的定义

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

我们打开回收站或者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 Administrator
16  *
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 Administrator
15  *
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;

}

时间: 2024-10-24 04:45:54

单例设计模式的相关文章

iOS 中的单例设计模式

单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单例在那个文件下都能取得到. 通过单例设计模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节省系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的选择. 下面来点实在的,创建单例代码上 方法1:基于线程安全创建一个单例 .h做一下声明 + (id)

设计模式之单例设计模式

一.何为单例设计模式 单例模式,顾名思义就是单个实例,程序中某个类只有一个实例存在.通常实在需要共享某个资源避免资源损耗的情况下使用到的. 二.单例设计模式的代码实现 一说到单例模式的概念,我们首先会想到下面的这种的写法 public class SingleInstance { private static SingleInstance singleInstance; /** * 单例模式 * @return */ public static SingleInstance getSingleI

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明

【学习笔记】单例设计模式笔记

单例设计模式是常见的设计模式之一.通过单例实现所需求类在系统中只存在唯一一个实例. 单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同. 实现代码: 1 public class HungryMan { 2 3 private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化 4 private static final HungryMan hungryMan=new HungryMan();//在类内定义一

IOS开发之单例设计模式

本文将从四个方面对IOS开发中的单例设计模式进行讲解: 一.什么是单例设计模式 二.我们为什么要用单例设计模式 三.单例设计模式的基本用法 四.自定义单例设计模式代码的封装 一.什么是单例设计模式 所谓单例,即是单个的实例化对象,保证一个类有且仅有一个实例.通常情况下,当我们对一个类实例化时(如:alloc.new等),并不能保证每次实例化的对象是唯一的实例.那么为了保证该类可在多次实例化的过程中保证内存地址不变,就需要引入单例设计模式. 二.我们为什么要用单例设计模式 1.Singleton

Java——单例设计模式

设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象.3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 这三部怎么用代码体现呢?1,将构造函数私有化.2,在类中创建一个本类对象.3,提供一个方法可以获取到该类对象. 对于事物该怎么描述,还怎么描述.当需要将该事物的对象

OC中的单例设计模式及单例的宏抽取

1 // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 2 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 3 4 #pragma Person.h文件 5 6 #import <Foundation/Foundation.h> 7 @interface Person : NSObject <NSCopying,NSMutableCopying> 8 + (instancetype)sharePerson; // 给类提供一

微信 使用单例设计模式 提供AccessToken 和Jsapi_ticket缓存支持

上一篇 是使用ecache 做的缓存, 有些简单的微信项目并不需要这么复杂,So就想到单例设计模式  首先,我们先定义一个单例对象 import java.util.HashMap; import java.util.Map; /**  *   * @author wangiegie  * @date 2015年9月29日下午8:13:06  * @description  */ public class Singleton { //缓存accessToken 的Map  ,map中包含 一个a

java的单例设计模式

/* 单例设计模式解决的问题:可以保证一个类在内存中对象唯性一性(数据实现了共享). 如何保证对象唯一性呢?1,不允许其他程序用 ,2,在该类创建一个本实例.3,对外提供一个方法让其他程序可以获取该象.步骤:1,私有化该类构造函数. 2.通过 new 在本类中创建一个对象. 3,定义一个公有的方法,将创建对象返回.*/ public class Test1 { public static void main(String[] args) { // TODO 自动生成的方法存根 Test5 t1=