Java设计模式之单例模式
摘要:相对于其他设计模式而言、单例模式无疑是我们平时最熟悉也最简单的设计模式、就算你对设计模式没有什么概念也会偶尔在项目中用到他。
一:Singleton Pattern优缺点
1、优点:
a)提供了对唯一实例的受控访问。
b)由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
a)允许可变数目的实例。
2、缺点:
a)由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
b)单例类的职责过重,在一定程度上违背了“单一职责原则”。
c)滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
二:Singleton Pattern三种实现方式
1、懒汉式:
package com.chy.dp.singleton;
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// do something
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2、饿汉式:
package com.chy.dp.singleton;
public class Singleton {
// 在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton() {
// do something
}
// 这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
3、双重锁式:
package com.chy.dp.singleton;
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}
三:Singleton Pattern连接oracle数据库
package com.chy.dp.singleton;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class SingletonOrclConn {
private final String driverClass = "oracle.jdbc.driver.OracleDriver";// 驱动类
private final String url = "jdbc:oracle:thin:@localhost:1521:chen";// 数据库连接url
private final String username = "chen";// 用户名
private final String password = "chen";// 密码
private Connection conn;
private Statement st;
private PreparedStatement ps;
/**
* single pattern;
*/
private static SingletonOrclConn orclConn;
private SingletonOrclConn() {
}
/**
* @return SingletonOrclConn instance;
*/
public static SingletonOrclConn getInstance() {
if (orclConn == null) {
orclConn = new SingletonOrclConn();
}
return orclConn;
}
/**
*
* @return an oracle connection
*/
private Connection getConnection() {
try {// 加载驱动、得到数据库连接
Class.forName(driverClass);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
System.out.println("Class DriverClass not found !");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("connection failed !");
e.printStackTrace();
}
return conn;
}
/**
*
* @return an sql statement
*/
public Statement getStatement(){
try {
if(st == null){
st = getConnection().createStatement();
}
} catch (SQLException e) {
e.printStackTrace();
}
return st;
}
/**
* @param the sql that you want to operate oracle!
* @return an sql PreparedStatement;
*/
public PreparedStatement getPreparedStatement(String sql){
try {
if(ps == null){
ps = getConnection().prepareStatement(sql);
}
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
/**
* close connection
*/
public void connClose(){
try {
if(conn != null){
if(!conn.isClosed()){
conn.close();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}