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的话这样就算是单例了吧?

解决方案 »

  1.   

    private的构造方法在抽象类中声明是没啥问题的,但是你这样干没什么意义,反而重载掉了默认无参数的构造方法,DAOFactory没有必要声明这个构造方法,而且你这样声明  在子类继承的时候就会报错。
    你要使用单例类,那么这个DAOFactory本身的具体子类 每个的构造方法设置为private就可以了能从外部new出一个类的实例,那么在JVM当中就会存在多个实例,那么肯定就不是单例,所以要让DAOFactory每个具体的子类的构造方法为private,然后提供一个public类型的getInstance()方法返回自身的实例
      

  2.   

    就是说只要保证子类的构造是private的就可以?DAOFactory的构造函数是public也OK的?
    能这么理解吗?
      

  3.   

    private static Object initLock = new Object();、
    synchronized (initLock)
    还有对例子里面的同步锁不是很理解。。锁的这个对象有什么用?不是应该锁DAOFactory本身吗?
      

  4.   


    DAOFactory的构造函数是public 但子类声明了private的同名构造参数就行了后面你问的问题 涉及到线程同步的问题,跟本贴无关了,而且一两句话根本说不清楚,你认真找多线程的书理解吧,需要花点时间才能理解java的多线程机制的