6.使用enum枚举数据类型实现单例模式
枚举enum和静态代码块的特性相似,在使用枚举时,构造方法会自动调用,也可以应用其这个特性实现单例设计模式。
创建项目,名称为6.6,创建类MyObject.java代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public enum MyObject {
connectionFactory;
private Connection connection;
private MyObject() {
try {
System.out.println("调用了MyObject的构造");
String url = "jdbc:sqlserver://localhost:8080;databaseName=Java";
String username = "aaa";
String password = "******";
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driverName);
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return connection;
}
}
创建线程类MyThread.java代码如下:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(MyObject.connectionFactory.getConnection().hashCode());
}
}
}
创建运行类Run.java代码如下:
public class Run {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
}
}
运行结果如下所示:
调用了MyObject的构造
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
42864587
7.使用enum枚举数据类型实现单例模式
上一节将枚举类进行曝露,违反了”职责单一原则“。下面将进行完善。
创建项目,名称为6.7,创建类MyObject.java代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MyObject {
public enum MyEnumSingleton {
connectionFactory;
private Connection connection;
private MyEnumSingleton() {
try {
System.out.println("调用了MyObject的构造");
String url = "jdbc:sqlserver://localhost:8080;databaseName=Java";
String username = "aaa";
String password = "******";
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(driverName);
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return connection;
}
}
public static Connection getConnection() {
return MyEnumSingleton.connectionFactory.getConnection();
}
}
创建线程类MyThread.java代码如下:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(MyObject.getConnection().hashCode());
}
}
}
创建运行类Run.java代码如下:
public class Run {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
}
}
运行结果如下所示:
调用了MyObject的构造
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
15974683
成功实现单例模式
以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git