use*_*422 4 java design-patterns
这是我获取数据库连接的单例类.
我在这里有一个问题:为什么必须在单例类中包含一个私有构造函数(在整个应用程序中我只调用一次这个类)并且可以使用静态方法实现类的一个实例?
这个私人构造函数可以避免,还是它是mantadatory?
public class ConnPoolFactory {
private static DataSource dataSource;
private static Connection connection;
private ConnPoolFactory() {
System.out.println(" ConnPoolFactory cons is called ");
}
public static synchronized Connection getConnection() throws SQLException {
try {
if (connection == null) {
Context initContext = new InitialContext();
Context envContext = (Context) initContext
.lookup("java:/comp/env");
dataSource = (DataSource) envContext.lookup("jdbc/Naresh");
connection = dataSource.getConnection();
} else {
return connection;
}
} catch (NamingException e) {
e.printStackTrace();
}
return connection;
}
}
Run Code Online (Sandbox Code Playgroud)
Vla*_*lad 18
否则每个人都可以创建一个类的实例,因此它不再是单例.对于单身人员,根据定义,只能存在一个实例.
Singleton模式通常包括非公共构造函数,原因有两个.必须存在构造函数,因为如果根本没有构造函数,则包含公共默认构造函数.但是,如果你有一个公共构造函数,那么人们可以随意制作自己的单身人士(有人不可避免地会这样做,这意味着可以有不止一个).
但它不一定是私人的.事实上,正如我所听到的那样,GoF指定的Singleton模式提到了受保护的构造函数,原因有些奇怪.关于继承的一些事情,我听说,但单身和继承在任何方面都不能很好地发挥作用.
甚至可以拥有一个公共构造函数,只要它可以检测实例是否已经存在并抛出异常或其他内容.这足以保证单一性.但这种情况并不常见,因为通过提供两种明显的方法来获取实例,这样做会使事情变得复杂 - 其中只有一种实际上有效.如果您不希望外部代码能够创建第二个实例,为什么构造函数应该成为公共接口的一部分?
如果你不需要延迟启动:
public class Singleton {
private static final Singleton instance = new Singleton();
// Private constructor prevents instantiation from other classes
private Singleton() { }
public static Singleton getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
是最好的方法,因为是线程安全的.