① 请教关于java的单态模式
从你的代码来看只有调用getInstance()方法,才会运行System.out.println("here run init()"); 这一句吧。
就算是在properties.load(...)这一句时构造函数又加载了一次,也不会输出"here run init()"这一句啊~
晕了~
=========================================================
我编译了下你这段代码(稍微有点修改)
import java.util.*;
public class Test{
private static Test instance = null;
public static synchronized Test getInstance() {
if(instance==null){
System.out.println("here run init()");
instance = new Test();
}
return instance;
}
private Test() {
init();
}
private void init(){
Properties p = new Properties();
try{
p.load(Test.class.getResourceAsStream("/option.properties"));
//以下是取配置,设置初始化配置的代码,此处略掉
}catch(Exception ioEx){
System.out.println("配置文件option.properties不存在");
}
}
public static void main(String[] args){
Test t1 = Test.getInstance();
Test t2 = Test.getInstance();
System.out.println(t1 == t2);
}
}
结果输出:
here run init()
配置文件option.properties不存在
true
只有一次……没什么问题啊~
===============================================
我把文件创建了,又运行了一次,输出:
here run init()
true
还是只有一次……没什么问题~
==============================================
对了
p.load(new FileInputStream("option.properties"));
这样也可以
===============================================
我装的 Java 6 Update 10
对了,你的电脑是双核的吗?
可能是双核的原因
同步出现了问题
使对象初始化了两次
我家的单核的……
以前在学校学线程那一块的时候
就因为双核的原因,有的例子老是出问题
② java的单态模式中用到了static。
1 可以用懒汉式单例:
class A{
private static A a=null;
private A(){
}
public synchronized static A getInstance(){
if(a == null){
a = new A();
}
return a;
}
}
2 既然是单例 所以操作的是同一对象 当然会干扰
③ java中常用的设计模式有哪些
1.单例模式(有的书上说叫单态模式其实都一样)
该模式主要目的是使内存中保持1个对象
2.工厂模式
该模式主要功能是统一提供实例对象的引用。看下面的例子:
public class Factory{
public ClassesDao getClassesDao(){
ClassesDao cd = new ClassesDaoImpl();
return cd;
}
}
interface ClassesDao{
public String getClassesName();
}
class ClassesDaoImpl implements ClassesDao {
public String getClassesName(){
System.out.println("A班");
}
}
class test
{
public static void main(String[] args){
Factory f = new Factory();
f.getClassesDao().getClassesName();
}
}
这个是最简单的例子了,就是通过工厂方法通过接口获取对象的引用
3.建造模式
该模式其实就是说,一个对象的组成可能有很多其他的对象一起组成的,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些对象的引用又包括很多的对象引用。封装这些复杂性,就可以使用建造模式。
4.门面模式
这个模式个人感觉像是Service层的一个翻版。比如Dao我们定义了很多持久化方法,我们通过Service层将Dao的原子方法组成业务逻辑,再通过方法向上层提供服务。门面模式道理其实是一样的。
5.策略模式
这个模式是将行为的抽象,即当有几个类有相似的方法,将其中通用的部分都提取出来,从而使扩展更容易。
④ java 中的单态模式是什么概念,有什么具体的应用,据个例子谢谢了
单例模式就是永远指定的是同一个对象!!!
给段代码给你,自己多理解!!!
public class SingleClass {
int i = 0;
static SingleClass sc = new SingleClass();
private SingleClass() {
}
public void test() {
System.out.println("hello" + (++i));
}
public static void main(String[] args) {
SingleClass c1 = SingleClass.sc;
SingleClass c2 = SingleClass.sc;
c1.test();
c2.test();
}
}
⑤ java中单态模式或单例模式(Singleton)有什么意义
你好!
存在某些类不需要实例化多次,也就是说
该类一般没有非静态的成员变量,只需要在系统运行时实例化一次就可以了,所以就存在单例模式
如有疑问,请追问。
⑥ java中单态模式或单例模式(Singleton)有什么意义
8.单态模式或单例模式(Singleton)
单
态模式有什么用呢?想一下Adobe Photoshop ,处理两张图,会启动两个photoshop吗?多耗费内存呀! ( Consider
Adobe or oracle, process two images with two
adobes?),所以单态模式在公司编程是非常重要的。有很多场合都要求,对象只能存在一个,多了的话就太耗费资源。(马克-to-win)
class Photoshop {
/* 通过调试发现写成 static Photoshop photoshop或static Photoshop
photoshop=null;
是一样的,开始时都为null,马克-to-win,另外在调试时
可以写上观察Photoshop.photoshop的值,它是独立于任何对象之外的,从程序开始运行的main方法时, 这个值就有了,
只不过为null罢了, 我们可以一直观察
*/
static Photoshop photoshop;//这个值独立于任何对象存在,实例化任何对象之前,这个成员就有可能有值。
static Photoshop getInstanceQixy() {
if (photoshop == null) {
photoshop = new Photoshop();
System.out.println("成功创建");
} else {
System.out.println("已经创建了该类的实例,不能再创建!");
}
return photoshop;
}
void drawImage() {
System.out.println("draw image using photoshop");
}
}
public class Test {
public static void main(String[] args) {
。。。。。。。。。。。。。。。。详情网上找“马克-to-win”,参考他的网站或他的网络空间:java第2章的内容
⑦ java 中的单态是怎么实现的
支持一下一楼!呵呵。。可以!
还有一种方式是用同步实现!代码:
public class Singleton {
private static Singleton instance;
private Singleton(){}//必须是私有。
public static Singleton getInstance() {
if instance == null
{
synchronized(Singleton.class)
{
instance = new Singleton() ;
}
}
return instance;//返回的永远是同一个inst
}
}
其实是一样的,但我还是觉得楼上的比较好,也比较常用。
⑧ java里,什么是单态,什么是多态
单态是一种设计模式,作用是保证在Java应用程序中,一个类Class只有一个实例存在。
多态嘛就是父类实例化不同的子类得到不同的结果,例如老虎和羊的父类是动物,老虎和羊都有一个方法就是吃,当分别用老虎和羊来实例化动物类并调用吃的方法时,一个是吃肉,一个是吃草,这种区别就是多态。
⑨ Java单例模式是什么意思
Java单例模式是确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例的模式;
Java单例模式分三种:懒汉式单例、饿汉式单例、登记式单例。
⑩ 编写一个JAVA类,要求实现类的单态设计模式
package org.jdbc.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//单例模式
public class JdbcUtilsSing {
private String url="jdbc:mysql://localhost:3306/hehe";
private String user = "root";
private String password = "k517liyu";
private static JdbcUtilsSing instance ;
//私有构造函数,不能被外部创建实例
private JdbcUtilsSing() {
}
public static JdbcUtilsSing getInstance() {
//双重检查,保证只会创建一个实例
if(instance == null) {
//防止2个以上的请求并发访问
synchronized (JdbcUtilsSing.class) {
//第一个请求创建实例后,保证后面拿到锁的请求不在创建新的实例
if(instance == null) {
instance = new JdbcUtilsSing();
}
}
}
return instance;
}
//静态代码块在类加载进内存的时候就自动执行
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError();
}
}
//获得连接
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public void free(ResultSet rs,Statement st,Connection conn) {
try {
if(rs != null){rs.close();}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(st != null) {st.close();}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn != null) {conn.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}