关闭

java单例模式

标签: 设计模式单例模式
341人阅读 评论(0) 收藏 举报
分类:

一、单例模式

java是一种静态语言,java中单例模式是一种常见的设计模式,单例模式有2种:(1)懒汉式单例、(2)饿汉式单例、(3)登记式单例。


二、单例模式特点:
    1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。


三、3种单例模式

1、饿汉式

/**
 * 
 *@类功能说明:饿汉式单例模式
 *@修改人员名: yang
 *@修改日期:    2015-11-18 下午01:33:55
 *@修改内容:
 *@修改次数:
 *@创建时间:    2015-11-18 下午01:33:55
 *@版本:V1.0
 */
public class TestInstence {
//私有化构造方法
private TestInstence(){}
//自己实例化
private static final TestInstence testInstence=new TestInstence();
//静态方法
public static TestInstence getInstence(){
return testInstence;
}
//测试
public static void main(String args[]){
TestInstence ts=new TestInstence();
System.out.println(ts);
}
}


2、懒汉式

/**
 * 
 *@类功能说明:测试懒汉式单例模式
 *@修改人员名: yang
 *@修改日期:    2015-11-18 下午01:42:31
 *@修改内容:
 *@修改次数:
 *@创建时间:    2015-11-18 下午01:42:31
 *@版本:V1.0
 */
public class TestInstenceLazy {
//私有化构造方法
private TestInstenceLazy(){}
//自己实例化,不用final修饰
private static  TestInstenceLazy testLazy=null;
//提供方法
public synchronized static TestInstenceLazy getLazy(){
//判断是否已经有对象
if(testLazy!=null){
testLazy=new TestInstenceLazy();
}
return testLazy;
}
//测试
public static void main(String args[]){
TestInstenceLazy ts=new TestInstenceLazy();
System.out.println(ts);
}
}

3、登记模式

import java.util.HashMap;
import java.util.Map;
/**
 * 
 *@类功能说明:登记式单例模式
 *@修改人员名: yang
 *@修改日期: 2015-11-18 下午04:57:02
 *@修改内容:
 *@创建时间: 2015-11-18 下午04:57:02
 *@版本:V1.0
 */
public class TestInstenceRegister {
private static Map<String, TestInstenceRegister> map = new HashMap<String, TestInstenceRegister>();
// 静态代码块,保证只初始化一次
static {
TestInstenceRegister tig = new TestInstenceRegister();
map.put(tig.getClass().getName(), tig);
}
// 保护构造方法
protected TestInstenceRegister() {}
// 静态方法,返回唯一的实例对象
public static TestInstenceRegister getInstence(String name) {
if (name == null) {
name = TestInstenceRegister.class.getName();
System.out.println("name == null" + "--->name=" + name);
}
if (map.get(name)==null) {
try {
map.put(name, (TestInstenceRegister) Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
//返回根据键得到的值对象
return map.get(name);
}
//例子
public String test(){
return "testName";
}
//测试
public static void main(String args[]){
TestInstenceRegister tig=TestInstenceRegister.getInstence(null);
System.out.println("类加载后的map结果:"+map);
System.out.println("调用方法后的结果:"+tig.test());
}
}


四、优缺点

主要优点:

1、提供了对唯一实例的受控访问。

2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

3、允许可变数目的实例。

 

主要缺点:

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。












1
0
查看评论

设计模式学习笔记---单例模式(Java版)

GOF23(Group of  four) 创建型模式 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。 结构型模式 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式。 行为型模式 模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-01-09 09:30
  • 1161

java中实现单例模式的几种方式,简单易懂

一、饿汉式单例类 public class Singleton { private Singleton(){ } private static Singleton instance = new Singleton(); private st...
  • yuxin6866
  • yuxin6866
  • 2016-08-14 09:39
  • 2651

Java中用单例模式有什么好处

Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。我们在浏览BBS、SNS网站的时候,常常会看到“当前在线人数...
  • huanbia
  • huanbia
  • 2017-05-12 10:05
  • 2347

Java中的单例模式的优秀实现

单例模式不得不说应该算初学者接触的最早几个设计模式之一了,主要是因为它的应用场景比起什么其他模式太简单易懂了,我们都知道,你要一个总体控制的类,比如一个能够初始化功能,提供特定功能的Helper类,那你用单例模式实现是非常有用的,而我在这里就要说一说单例模式的优秀实现方式
  • ll530304349
  • ll530304349
  • 2016-09-21 15:25
  • 430

JAVA设计模式之单例模式

概念:   java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。   单例模式有一下特点:   1、单例类只能有一个实例。   2、单例类必须自己自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。   单例模式确保某个类只有一个实例,...
  • jason0539
  • jason0539
  • 2014-04-16 06:51
  • 635664

用单例模式实现的java连接MySql数据库

 package com.adrop.util; import java.sql.*; public class DBManager {//用户名  private String user = "";//密码  private S...
  • lvyuanfang
  • lvyuanfang
  • 2004-12-18 16:47
  • 1038

java面试必备——单例模式

今天面试,本人做安卓开发,但java基础一般,半路出家的水平,死在java上了,从今天起,坚持更新博客,把我自己遇到的问题记录下来。单例模式其实很多开源的源码中都能看见,但是不一定会引起重视,今天好还研究下,网上大把多的例子。 另外回忆一下面试java知识点: 1、单例模式 2、多线程同步; 3、A...
  • ezview_uniview
  • ezview_uniview
  • 2016-04-28 22:52
  • 1402

Java五种单例模式与线程安全

转载自:http://blog.chenzuhuang.com/archive/13.html     《设计模式》提出近二十年里,随着面向对象语言发展,单例模式也随之演化,如今其实现形式变得多种多样。常见的单例模式有懒汉、饿汉、双 重校验锁、枚举和静态内部类五种形式。
  • janch1
  • janch1
  • 2016-02-25 16:12
  • 2530

java单例模式原理

Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.再举个例子,集合中的 set 中不能包含重复的元素,添加到se...
  • xiaoxiaocoder
  • xiaoxiaocoder
  • 2012-10-17 14:08
  • 2716

使用单例模式设计JDBC连接数据库

设计模式之单例模式一般应用在在数据库操作里,数据库操作就要经常创建实例,然后进行数据库操作,所有就可以 将数据库操作的方法,进行封装,然后采用单例模式进行设计,然后采用单例模式之后,就可以节约系统资源,对于 一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。 ...
  • u013161431
  • u013161431
  • 2017-07-26 10:04
  • 550
    个人资料
    • 访问:886058次
    • 积分:12880
    • 等级:
    • 排名:第1266名
    • 原创:423篇
    • 转载:64篇
    • 译文:54篇
    • 评论:102条
    博客专栏
    最新评论