public abstract class DAOFactory {
//这个构造器添加了就会报错
private DAOFactory(){
}
private static Object initLock = new Object(); private static DAOFactory factory = null; //开发模式: 工厂模式Factory、单例模式singleton
public static DAOFactory getInstance() {
if (factory == null) {
synchronized (initLock) {
if (factory == null) {
try {
//ConfigurationStaticFinal_app.DBType作用就是从配置中读取选用的方案,接着根据方案创建不同的实例
//DAOFactoryJDBC4MySQL就是用来返回DAO实例的
String DBType=ConfigurationStaticFinal_app.DBType;
if(DBType.equals("MySQL")){
factory = DAOFactoryJDBC4MySQL.getInstances();
}
if(DBType.equals("Oracle")){
factory = new DAOFactoryJDBC4Oracle().getInstances();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
}
return factory;
}
}
------------------------------------------------------------------------------------------------------
下面是
DAOFactoryJDBC4MySQL();
public class DAOFactoryJDBC4MySQL extends DAOFactory{
private DAOFactoryJDBC4MySQL(){
}
public static DAOFactoryJDBC4MySQL getInstances(){
return new DAOFactoryJDBC4MySQL();
}
public UserDAO createUserDAO() {
return new UserDAOImplJDBC4MySQL();
}
}
这里有个问题。。
如果没private构造器,依然可以通过new关键字去创建该类。。
但是如果使用了private构造器,子类继承的时候就会出问题了(因为必须调用一次父类的构造器但是设置了private就不可调用了。)
想问下大家有没什么解决的办法。。可以让DAOFactory跟他的子类都只能通过静态方法去返回他的实例,而不能在外部调用直接New?
本人还在学习当中,对于实际的开发不了解,想问下大家在实际当中,有没必要规定构造器是私有的?如果可以通过外部new出instance的话这样就算是单例了吧?
//这个构造器添加了就会报错
private DAOFactory(){
}
private static Object initLock = new Object(); private static DAOFactory factory = null; //开发模式: 工厂模式Factory、单例模式singleton
public static DAOFactory getInstance() {
if (factory == null) {
synchronized (initLock) {
if (factory == null) {
try {
//ConfigurationStaticFinal_app.DBType作用就是从配置中读取选用的方案,接着根据方案创建不同的实例
//DAOFactoryJDBC4MySQL就是用来返回DAO实例的
String DBType=ConfigurationStaticFinal_app.DBType;
if(DBType.equals("MySQL")){
factory = DAOFactoryJDBC4MySQL.getInstances();
}
if(DBType.equals("Oracle")){
factory = new DAOFactoryJDBC4Oracle().getInstances();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
}
return factory;
}
}
------------------------------------------------------------------------------------------------------
下面是
DAOFactoryJDBC4MySQL();
public class DAOFactoryJDBC4MySQL extends DAOFactory{
private DAOFactoryJDBC4MySQL(){
}
public static DAOFactoryJDBC4MySQL getInstances(){
return new DAOFactoryJDBC4MySQL();
}
public UserDAO createUserDAO() {
return new UserDAOImplJDBC4MySQL();
}
}
这里有个问题。。
如果没private构造器,依然可以通过new关键字去创建该类。。
但是如果使用了private构造器,子类继承的时候就会出问题了(因为必须调用一次父类的构造器但是设置了private就不可调用了。)
想问下大家有没什么解决的办法。。可以让DAOFactory跟他的子类都只能通过静态方法去返回他的实例,而不能在外部调用直接New?
本人还在学习当中,对于实际的开发不了解,想问下大家在实际当中,有没必要规定构造器是私有的?如果可以通过外部new出instance的话这样就算是单例了吧?
解决方案 »
- 初学多线程,求教(九格子游戏)
- 经常出现这样的警告,这是为什么,关于serialVersionUID
- 问一个有点傻的问题,就是这个程序在把数据保存到count.txt文件里时,这个Count=读取次数中的“=”号是如何生成的?
- dwr和struts集成时出现了问题?那位高手帮下忙啦.....
- JBuilder界面插件UITheme
- java与C++在面向对象方面有哪些不同?
- 8)java.sql.date中是否可以带时间,(目前只有日期)
- 编译成exe
- 谁知道winamp skin的机制是如何实现的吗?急!!!!!!
- 做一个学生管理系统的具体步骤
- 求大神解答,如何解决以下问题
- 大家怎样快速安装jdk?
你要使用单例类,那么这个DAOFactory本身的具体子类 每个的构造方法设置为private就可以了能从外部new出一个类的实例,那么在JVM当中就会存在多个实例,那么肯定就不是单例,所以要让DAOFactory每个具体的子类的构造方法为private,然后提供一个public类型的getInstance()方法返回自身的实例
能这么理解吗?
synchronized (initLock)
还有对例子里面的同步锁不是很理解。。锁的这个对象有什么用?不是应该锁DAOFactory本身吗?
DAOFactory的构造函数是public 但子类声明了private的同名构造参数就行了后面你问的问题 涉及到线程同步的问题,跟本贴无关了,而且一两句话根本说不清楚,你认真找多线程的书理解吧,需要花点时间才能理解java的多线程机制的