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

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

设计模式一--单例设计模式

一、定义

Singleton Pattern:

确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

 

 

二、分类

饿汉式单例类:类加载时就进行对象的实例化

懒汉式单例类:第一次引用类时,才进行对象的实例化。

 

 

三、核心代码

3.1 饿汉式

class Singleton{   private static Singleton m_instance=new Singleton();   //构造方法私有,保证外界无法直接实例化   private Singleton(){   }   //通过该方法获得实例对象   public static Singleton getInstances(){     return m_instance;   }}

 

3.2 懒汉式

class Singleton2{   private static Singleton2 _instance=null;   //构造方法私有,保证外界无法直接实例化   private Singleton2(){   }   //通过该方法获得实例对象   public static Singleton2 getInstances(){     if(_instance==null){        _instance=new Singleton2();     }     return _instance;   }}

 

四、实例

4.1 饿汉式

class Singleton{   //成员变量x用来测试   int x;   private static Singleton m_instance=new Singleton();   //构造方法私有,保证外界无法直接实例化   private Singleton(){    }   //通过该方法获得实例对象   public static Singleton getInstances(){     return m_instance;   }} public class SingletonPattern {     public static void main(String[] args) {     Singleton.getInstances();     Singleton.getInstances().x=1;   }}

4.2 懒汉式

 

class Singleton2{   //成员变量x用来测试   int x;   private static Singleton2 _instance=null;   //构造方法私有,保证外界无法直接实例化   private Singleton2(){    }   //通过该方法获得实例对象   public static Singleton2 getInstances(){     if(_instance==null){        _instance=new Singleton2();     }     return _instance;   }} public class SingletonPattern2 {     public static void main(String[] args) {     Singleton2.getInstances();     Singleton2.getInstances().x=1;     System.out.println(Singleton2.getInstances().x=1);   }}

五、单例模式的优缺点

5.1 优点

  只有一个实例,减少内存开销,避免对资源的多重占用

  可以设置全局访问点,优化和共享资源访问

 

5.2 缺点

  无法创建子类

  单例模式与单一职责原则有冲突

 

 

六、单例模式的使用场景

  要求生成唯一序列号的地方

  在整个项目中需要一个共享访问点和共享数据

  创建一个对象消耗的资源太多

  需要定义大量的静态常量和静态方法(如工具类)的环境

 

 

 

七、单例模式的应用实例

7.1 代码

1 class GlobalNum{ 2  3    private int num=0; 4  5    private static GlobalNum globalNum=new GlobalNum(); 6  7    // 8  9    public static GlobalNum getInstance() {10 11      return globalNum;12 13    }14 15    //synchronized同步化16 17    public synchronized int getNum() {18 19      return num++;20 21    }22 23    public synchronized void setNum(int num) {24 25      this.num = num;26 27    }28 29 }30 31  32 33 class NumbelThread extends Thread{34 35    private String threadName;36 37    public NumbelThread(String name) {38 39      threadName=name;40 41    }42 43   44 45    public void run(){46 47      GlobalNum globalNum=GlobalNum.getInstance();48 49      //循环访问,输出访问次数50 51      for (int i = 0; i < 5; i++) {52 53         System.out.println(threadName+"第"+globalNum.getNum()+"次访问");54 55        56 57      }58 59    }60 61 }62 63  64 65 public class SingletonDemo {66 67  68 69    public static void main(String[] args) {70 71      NumbelThread threadA=new NumbelThread("线程A");72 73      NumbelThread threadB=new NumbelThread("线程B");74 75      threadA.start();76 77      threadB.start();78 79    }80 81  82 83 }

 

7.2 运行结果

线程A第0次访问

线程B第1次访问

线程A第2次访问

线程A第4次访问

线程B第3次访问

线程B第6次访问

线程B第7次访问

线程A第5次访问

线程B第8次访问

线程A第9次访问

 

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

你可能感兴趣的文章
Inno Setup入门(二)——修改安装过程中的图片
查看>>
第七周总结报告
查看>>
服务器性能瓶颈分析方法(转载)
查看>>
第二次小组作业每日汇报--1702班三组
查看>>
Spring 集成rabbiatmq
查看>>
JAVA设计模式之建造者模式
查看>>
JAVA学习笔记——JAVA基础语法(六)
查看>>
modelform实例学习
查看>>
EF CRUD
查看>>
初识python:time 模版
查看>>
mysql慢查询日志分析工具mysqldumpslow
查看>>
4.09.1
查看>>
电话本管理程序(实现增删改查功能)
查看>>
axure跨inframe传递参数
查看>>
LOCK_TIMEOUT
查看>>
Python脱产8期 Day29 2019/5/24
查看>>
学c#语言的感想
查看>>
树形结构
查看>>
hihoCoder挑战赛28 题目1 : 异或排序
查看>>
Windows 驱动模型的发展历史
查看>>