- 浏览: 1263521 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (399)
- 心情故事 (12)
- java (115)
- linux (55)
- 关系型数据库 (35)
- struts,jsf,spring (11)
- jdbc,hibernate,ibatis (11)
- jsp,jstl,c:tag,标签库 (2)
- ejb,webservice (1)
- tomcat,jboss,jetty,weblogic,websphere (15)
- java网络编程 (6)
- java线程 (0)
- js,jquery,json,xml,dom,html.regex (25)
- 设计模式 (6)
- BUG记录 (2)
- ant (2)
- jsp,servlet (4)
- swing (6)
- lucene+nutch (6)
- log4j (2)
- windows doc (2)
- ruby (1)
- ruby on rails (3)
- 操作系统网络 (18)
- apache 错误 (1)
- tomcat (10)
- jboss (9)
- jetty (9)
- weblogic (9)
- websphere (10)
- apache (2)
- AIX的iostat命令查看系统磁盘的使用情况 (1)
- oracle 统计一个表格有多少列 (1)
- Exception in thread "main" java.security.KeyStoreException: Windows-MY not found (1)
- jsp (1)
- jstl (1)
- c:tag (1)
- 标签库 (1)
- struts (1)
- jsf (1)
- spring (2)
- oracle,sqlplus (2)
- sqlplus (2)
- show errors (1)
- proc (1)
- function (1)
- ORA-06544: PL/SQL: internal error (1)
- arguments: [55916] (1)
- [] (7)
- 终端身份实施文档 (1)
- 重装系统之后飞鸽传书只能看到自己 (1)
- vsftp "上传 553 Could not create file" (1)
- startWebLogic.sh启动失败,提示Error initializing Embedded LDAP Server (1)
- java agent 注册为 windows 服务 (1)
- centos (1)
- svn (1)
- apr (1)
- apr-util (1)
- activemq (2)
- oracle (5)
- mysql (3)
- nosql (3)
- NSIS (1)
- windows wmic (1)
- c 指针 (1)
- c c++ (0)
- jmeter (0)
- 性能测试 (0)
- linux,备份 (2)
- C++ ,Virtual (1)
- windows dos (1)
- android (2)
- 大数据,云计算 (1)
- JVM垃圾收集 (1)
- jdbc (2)
- invoke (1)
- hibernate (1)
- ibatis (1)
- 个人开源项目源码收藏 (1)
- 批处理 (1)
- Mongodb mapreduce (8)
- kettle (1)
- Mongodb capped (1)
- mongodb gridfs (1)
- Mongodb 入门基础知识 (1)
- mongodb (8)
- hadoop2.5.1 (1)
- hadoop (4)
- eclipse (1)
- hdfs fs (1)
- elipse hadoop plugin (1)
- PHP相关知识 (1)
- js (1)
- jquery (1)
- json (1)
- xml (1)
- dom (1)
- html.regex (1)
- 网络知识 (1)
- nginx (1)
- docker (1)
- 测试 (1)
- nodejs (1)
- iptables (1)
- linux gitlab (1)
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
web页面调用window.print()函数实现打印的功能 -
hxdtech:
非常感谢!
我在学习ibatis时的培训ppt -
zmwxiaoming:
what 能连数据库不错
SOLR的学习整理 -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java获取当前操作系统的信息 -
huanzei:
整理的不错,
oracle lpad函数
小弟最近想学习java的设计模式,就从单例模式来学起吧。大家知道在java语言中,可以利用static 关键字来构建单例模式,主要是因为static 这个关键字在所在的类在被java虚拟机装载的时候,变量是最先被装载(如果有多个,那么按照从上往下的顺序执行的),并且是全局共享的。
因此:按照这个理解:我写了一个单例模式。代码如下:
public class Test{
private static
Test test=null;
public static
Test getInstence(){
if(test==null)
{
test=mew Test();
}
return test;
}
}
在这个方法里,我申明了一个private static类型的成员变量,然后申明了一个static类型的方法,判断test如果是null,则实例化,然后返回Test类的一个实例。应为static类型的变量是全局共享的,所以,一旦test被实例化,那么则被存放到java虚拟机的堆中,全局共享,以后不会在实例化。直到类的生命周期结束然后才会被销毁。在别的类要引用的时候,只需要Test.getInstence()就可以获得一个实例。这就是我理解的单利模式。
但我在网上看了另一种写法,说要有一个私有的构造函数,代码是这样的。
public class Test{
private Test(){}
private static Test test=new Test();
public static
Test getInstence(){
return test;
}
}
我是这样理解这个类的:
1 private static Test test=new Test();在jvm 装载这个类的时候会初始化这个声明,Test类的实例test已经被实例化。并且全局共享。
2
public static
Test getInstence(){ }
static的方法getInstence用来返回Test 类的实例。这个实例就是上面已经实例化的那个(唯一的一个)
问题一:问题是私有的构造函数,我不明白为什么一定要有个私有的构造函数?大家帮 忙看看! 问题二:在开发单例模式中有那些是需要注意的地方?比如构造方法之类的要注意什 么?
问题三:单利模式有几种形式?能不能给个例子?听说有懒汉式什么的?
问题四:什么时候需要用到单例模式?
请大家不宁赐教!多谢!我的邮箱lifeneedyou@163.com
,可以发邮件给我!
return test;
评论
比如以下代码
import java.util.*; public enum Catalog { soleInstance; private Map<String,Book> books = new HashMap<String,Book>(); public void add(Book book) { books.put(book.getClassification(), book); } public Book get(String classification) { return books.get(classification); } //其他的一大堆的方法... }
枚举内的方法少一点的话感觉看上去还算舒服,如果方法有6、7个之多,私有变量也很多,
因为习惯了通常的class方式,看这样的enum有点接受不了

一般singleton是用下面的写法,和楼主的写法区别在于,线程安全性,是用jvm来保证的public class SingleTon{ private SingleTon() { } public static SingleTon getInstance() { return Holder.singleTon; } private static class Holder{ private static SingleTon singleTon=createSingleTon(); private static SingleTon createSingleTon(){ //工厂方法,可以做一些你需要的初始化 return new SingleTon(); } } //.....其它的方法。。。。。。。}1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类)2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。
很详细!谢谢!
谢谢关注!
的确,据joshua bloch说,这是单例应用的最佳方法。
public class SingleTon
{
private SingleTon()
{
}
public static SingleTon getInstance()
{
return Holder.singleTon;
}
private static class Holder{
private static SingleTon singleTon=createSingleTon();
private static SingleTon createSingleTon(){
//工厂方法,可以做一些你需要的初始化
return new SingleTon();
}
}
//.....其它的方法。。。。。。。
}
1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类)
2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。
3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。
4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。
2这里的线程安全问题是怎么回事?
1.私有构造行数是禁止通过实例该类获得对象,如:
new Test().getInstence();
2.线程安全是指如果有多个线程,在第一个线程还没有执行到new Test()的时候,第二个现成调用该方法时判断test仍然为null,所以仍然会执行new Test()。
所以一般使用synchronized关键字将该方法声明成同步方法,如:
public static synchronized Test getInstence
非常感谢longrui!受教了!
2这里的线程安全问题是怎么回事?
1.私有构造行数是禁止通过实例该类获得对象,如:
new Test().getInstence();
2.线程安全是指如果有多个线程,在第一个线程还没有执行到new Test()的时候,第二个线程调用该方法时判断test仍然为null,所以仍然会执行new Test()。
所以一般使用synchronized关键字将该方法声明成同步方法,如:
public static synchronized Test getInstence
2这里的线程安全问题是怎么回事?
如:
public class ObjectPoolFactory { private static ObjectPoolFactory objectPoolFactory; private ObjectPoolFactory() { } public ObjectPool createPool(ParameterObject paraObj, Class clsType) { return new ObjectPool(paraObj, clsType); } public static ObjectPoolFactory getInstance() { if (objectPoolFactory == null) { objectPoolFactory = new ObjectPoolFactory(); } return objectPoolFactory; } }
类似一个公司的CEO吧,因为CEO只有一个,然后管理下面所有人员!
问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的……
问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子
问题三:看书
问题四:你只有有一个实例,又不想他声明为一个全局变量时……
这里有必要做同步吗?
只是简单的if判断和返回static对象地址呀
……看看书吧 GoF23中对单例的说明很详细的吧- -问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的……问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子问题三:看书问题四:你只有有一个实例,又不想他声明为一个全局变量时……
多谢!
Struts1.x的Action类的设计就是Singlenon 所有的request共享一个Action 所以要注意线程安全问题 单例可以节省资源 小生拙见!呵呵
谢谢你的关注!单例是可以节省资源。
问题一:公开构造性,你还写个getInstance的方法,不很好笑吗- -;不一定要私有级的的,但起码是保护级的……
问题二:getInstance方法按照你那个写法是线程不安全的,判断的时候加同步锁,参考head first上的几个例子
问题三:看书
问题四:你只有有一个实例,又不想他声明为一个全局变量时……
所有的request共享一个Action
所以要注意线程安全问题
单例可以节省资源
小生拙见!呵呵
发表评论
-
java 装饰器模式
2010-01-08 11:07 22612记得以前听一个高手说java.io包采用了了装饰器模式, ... -
Java 观察者模式observer
2009-12-31 15:03 1914观察者模式:顾名思义就是有个人在观察着一些东西,一旦这 ... -
java策略模式
2009-12-31 13:58 3099head first对策略模式的定义是:封装一系列 ... -
Java简单工厂模式
2009-12-31 11:19 1663package pattern.factory; pub ... -
java 代理模式detegate
2009-12-31 11:06 1730我对代理模式的理解是:一个人本该他去做的事情,他 ...
相关推荐
1:虚拟机加载StaticDemo类,保存类型信息到方法区。... (1)装载,通过类的全名产生对应类的二进制数据流,分析二进制数据流并转换为方法区特定的数据结构,创建对应类的java.lang.Class实例。 (2)链
8. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,提高代码的可复用性和可维护性。 9. **JDBC数据库操作**:使用Java连接数据库,执行SQL语句,处理结果集。 10. **Java标准库**:熟悉...
关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...
11. **设计模式**:报告可能涵盖了常见的设计模式,如单例、工厂、观察者模式等,并通过源代码展示了它们在实际项目中的应用。 12. **源代码**:提供的源程序代码是理解和学习Java编程的重要资源,每个文件名可能...
3. **设计模式与架构**: 学习常见的设计模式(如工厂模式、单例模式、观察者模式等)和软件架构原则,可以提升代码质量和系统的可维护性。 4. **高级特性**: 包括泛型、反射、注解、枚举、并发编程等,这些都是...
2. **面向对象编程**:深入理解类的设计,包括属性、方法、构造器以及类之间的关系,如单例模式、工厂模式等设计模式的应用。 3. **异常处理**:理解和使用try-catch-finally语句块来捕获和处理程序运行时可能出现...
3. **设计模式**:Java中常见的设计模式如单例模式、工厂模式、观察者模式等,是解决常见软件工程问题的通用解决方案。掌握这些模式能提高代码质量和可维护性。 4. **反射机制**:Java反射允许程序在运行时检查类的...
13. **设计模式**:在JAVA开发中,设计模式是解决常见问题的最佳实践,如单例模式、工厂模式、观察者模式等,它们提供了可复用的解决方案。 14. **JVM(Java Virtual Machine)**:JAVA程序通过JVM运行,理解JVM的...
【Java个人简历代码】是一个关于Java编程语言的项目,它包含了一组代码示例,用于展示个人在Java领域的技能和经验。这个项目可能是为求职者准备的,以便他们在面试或应聘时能展示自己的编程能力。729832422可能是...
8. 设计模式:单例、工厂、观察者等常见设计模式的应用。 9. Java高级特性:Lambda表达式、Stream API、反射等。 作者微信.docx 这可能是一个联系方式文档,作者可能通过微信分享更多的学习资源、解答疑问或建立...
10. **设计模式**:在提供的源码中,可能还会发现一些常见的设计模式,如工厂模式、单例模式、观察者模式等,这些都是解决特定问题的通用解决方案。 通过分析和学习这些例子,开发者不仅可以理解Java的基本概念,还...
8. **设计模式**:为了使代码更易维护和扩展,开发者可能会应用一些设计模式,如单例模式(用于控制资源的唯一性),工厂模式(用于创建对象)或者观察者模式(用于实现事件监听)。 9. **编译与运行**:Java程序...
11. **设计模式**:这些案例可能包含了常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,这些都是解决特定问题的标准化解决方案,学习者可以通过实践加深对设计模式的理解。 12. **Swing或JavaFX...
- **代码结构**:遵循良好的编程规范,使用面向对象的设计模式,如单例模式、工厂模式等,提高代码的可读性和可维护性。 在“小学生管理系统”这个压缩包中,包含了整个项目的源代码和可能的数据库文件。初学者可以...
9. **设计模式**:在编写复杂软件系统时,设计模式如单例模式、工厂模式等可以帮助提高代码的可读性和可维护性。开发者可能在项目中应用了这些模式。 10. **版本控制**:项目可能使用Git进行版本管理,通过提交和...
- **常见问题**:解答了关于Velocity使用过程中的常见疑问,如访问类成员和常量、查找模板的位置等。 13. **总结** - **Summary**:回顾了整个指南的主要内容。 14. **附录** - **Deploying the Example ...
11. **设计模式**:可能会有一些基础的设计模式应用,如单例模式、工厂模式等。 12. **单元测试**:JUnit的使用,进行代码测试以确保其正确性。 13. **图形用户界面(GUI)**:可能涉及到Swing或JavaFX库,用于...
1. **设计模式**:单例模式、工厂模式、装饰器模式等常见设计模式的实现。 2. **文件操作**:读取、写入文件,目录操作,文件复制。 3. **多线程**:线程的创建,同步机制(synchronized,wait(),notify()),...
14. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,提高代码的可读性和可维护性。 如果压缩包内的"video1"代表视频教程,那么这部分可能包含了讲解上述概念的视觉演示,使得学习更加直观...
9. **设计模式**:设计模式是软件开发中的最佳实践,第14章可能介绍一些常见的设计模式,如单例、工厂、观察者、装饰者、适配器等,并讲解如何在Java中应用它们。 10. **JavaFX或Swing图形用户界面**:如果教程覆盖...