单例模式
来源:互联网 发布:数据交易平台有哪些 编辑:程序博客网 时间:2024/06/07 00:50
GoF对单例模式(Singleton Pattern)的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
笔者在这里以MM的男朋友GG为例进行单例模式的说明。
GG单例模式的第一个版本,采用的是“饿汉式”,也就是当类加载进来的就立即实例化GG对象,但是这种方式比较的消耗计算机资源。具体实现代码如下:
package com.diermeng.designPattern.Singleton;
/*
* GG单例模式的第一个版本 为“饿汉式”
*/
public class GGVersionOne {
//在类被加载进入内存的时候就创建单一的GG对象
public static final GGVersionOne gGVersionOne = new GGVersionOne();
//名称属性
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private GGVersionOne() {
}
//提供一个全局的静态方法
public static GGVersionOne getGG() {
return gGVersionOne;
}
}
GG单例模式的第二个版本:“懒汉式”,在单线程下能够非常好的工作,但是在多线程下存在线程安全问题,具体代码如下:
package com.diermeng.designPattern.Singleton;
/*
* GG单例模式的第二个版本 采用“懒汉式” 在需要使用的时候才实例化GG
*/
public class GGVersionTwo {
//GG的姓名
private String name;
//对单例本身引用的名称
private static GGVersionTwo gGVersionTwo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private GGVersionTwo() {
}
//提供一个全局的静态方法
public static GGVersionTwo getGG() {
if(gGVersionTwo == null) {
gGVersionTwo = new GGVersionTwo();
}
return gGVersionTwo;
}
}
GG单例模式的第三个版本,为解决多线程问题,采用了对函数进行同步的方式,但是比较浪费资源,因为每次都要进行同步检查,而实际中真正需要检查只是第一次实例化的时候,具体代码如下所示:
package com.diermeng.designPattern.Singleton;
/*
* GG单例模式的第三个版本 对函数进行同步
*/
public class GGVersionThree {
//GG的姓名
private String name;
//对单例本身引用的名称
private static GGVersionThree gGVersionThree;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private GGVersionThree() {
}
//提供一个全局的静态方法,使用同步方法
public static synchronized GGVersionThree getGG() {
if(gGVersionThree == null) {
gGVersionThree = new GGVersionThree();
}
return gGVersionThree;
}
}
GG单例模式第四个版本,既解决了“懒汉式的”多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择,具体代码如下所示:
package com.diermeng.designPattern.Singleton;
/*
* GG单例模式的第四个版本,既解决了“懒汉式的”多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择
*/
public class GGVersionFour {
//GG的姓名
private String name;
//对单例本身引用的名称
private static GGVersionFour gGVersionFour;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private GGVersionFour() {
}
//提供一个全局的静态方法
public static GGVersionFour getGG() {
if(gGVersionFour == null) {
synchronized (GGVersionFour.class) {
if(gGVersionFour == null) {
gGVersionFour = new GGVersionFour();
}
}
}
return gGVersionFour;
}
}
最后我们建立测试客户端测试一下版本四:
package com.diermeng.designPattern.Singleton.client;
import com.diermeng.designPattern.Singleton.GGVersionFour;
/*
* 测试客户端
*/
public class SingletonTest {
public static void main(String[] args) {
//实例化
GGVersionFour gG1 = GGVersionFour.getGG();
GGVersionFour gG2 = GGVersionFour.getGG();
//设值
gG1.setName("GGAlias");
gG2.setName("GG");
System.out.println(gG1.getName());
System.out.println(gG2.getName());
}
}
输出的结果如下:
GG
GG
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- javascript跳转页面
- RSA遭駭後續報導:0 day漏洞還有很多 企業要更繃緊神經
- MVC中实现多按钮提交(转)
- ASP.NET本质论
- jsp servlet javaBean区别 与 jsp 和servlet区别
- 单例模式
- CAS原理分析
- ADO组件之删除、查询数据记录
- 从软件工程看沟通
- SELECT多列,update单列
- EclipseUML最新下载地址
- Swing组件布局setLayout(null)和setBounds(int,int,int,int)用法及组件分层显示
- 序列化问题
- vim 使用技巧汇总