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

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

  今天翻看以前的面试题突然发现一个题目是  “什么是设计模式?” 翻了翻答案上面的回答是  

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的: 为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是 的基石脉络,如同大厦的结构一样。。。然后列举了23种设计模式 :单例模式、工厂模式.等23总模式。
 
  看到这里我不禁萌发了要学习一下的心情。O(∩_∩)O哈哈~。首先不多说了 先学习一下我觉着最简单的一种吧。

学习方法:经典三问 即是什么?什么情况下使用? 怎么使用?
单例模式是什么 ?
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例。
什么情况下使用?
一些 常常设计成单例模式。
在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
怎么使用?
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
 
下面贴一下单例模式的Java 小栗子
一般Singleton模式通常有三种形式:
第一种形式:懒汉式,也是常用的形式。
1
2
3
4
5
6
7
8
9
10
11
public 
class 
SingletonClass{
    
private 
static 
SingletonClass instance=
null
;
    
public 
static
 
synchronized
 SingletonClass getInstance(){
        
if
(instance==
null
){
               
instance=
new 
SingletonClass();
        
}
        
return 
instance;
    
}
    
private 
SingletonClass(){
    
}
}
第二种形式:饿汉式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//对第一行static的一些解释
// java允许我们在一个类里面定义静态类。比如内部类(nested class)。
//把nested class封闭起来的类叫外部类。
//在java中,我们不能用static修饰顶级类(top level class)。
//只有内部类可以为static。
public 
class 
Singleton{
    
//在自己内部定义自己的一个实例,只供内部调用
    
private 
static 
final Singleton instance = 
new 
Singleton();
    
private 
Singleton(){
        
//do something
    
}
    
//这里提供了一个供外部访问本class的静态方法,可以直接访问
    
public 
static 
Singleton getInstance(){
        
return 
instance;
    
}
}
第三种形式: 双重锁的形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public 
class 
Singleton{
    
private 
static 
volatile 
Singleton instance=
null
;
    
private 
Singleton(){
        
//do something
    
}
    
public 
static  
Singleton getInstance(){
        
if
(instance==
null
){
            
synchronized(Singleton.
class
){
                
if
(instance==
null
){
                    
instance=
new 
Singleton();
                
}
            
}
        
}
        
return 
instance;
     
}
}
//这个模式将同步内容下放到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
//这种模式中双重判断加同步的方式,比第一个例子中的效率大大提升,因为如果单层if判断,在服务器允许的情况下,
//假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。
//所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/xingtangxublog/p/8552491.html

你可能感兴趣的文章
心得25--JDK新特性9-泛型1-加深介绍
查看>>
SpringCloud入门之Spring Boot多环境配置切换指南
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
查看>>
php三方网站使用微信公众号推送文章
查看>>
latex tree
查看>>
微信小程序flex布局
查看>>
jquery 三级关联选择效果
查看>>
Css 特性之 transition和transform
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
函数调用可视化
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
关于开罗
查看>>
css3学习01
查看>>
二维数组的最大子数组和 时间复杂度:O(n的四次方)
查看>>
故事板 — 视图切换(segue)与传值
查看>>
HNOI2018 滚粗记
查看>>
【USACO】 奶牛会展
查看>>
bzoj 2655: calc
查看>>