本文讲解,设计模式中最简单的单例模式在,图书管理系统中的简单应用。
对于静态同步方法可以查看这篇文章:Java中的静态同步方法
当你在开发Spring Boot项目时,可以使用单例模式来优化代码。下面是几个如何在Spring Boot中实现单例模式的示例。
饿汉式单例模式指在程序启动时就创建一个静态对象,并将其作为单例实例使用。这种方式简单直接,但存在一定的内存浪费。
@Component
public class SingletonClass {
private static final SingletonClass instance = new SingletonClass();
private SingletonClass() { }
public SingletonClass getInstance() {
return instance;
}
}
懒汉式单例模式指在第一次请求对象时再创建对象,避免了内存浪费,但需要使用同步锁解决线程安全问题。
@Component
public class SingletonClass {
private static SingletonClass instance;
private SingletonClass() { }
public synchronized SingletonClass getInstance() {
if (instance == null) {
instance = new SingletonClass();
}
return instance;
}
}
枚举类型单例模式是一种方便、高效、线程安全的单例模式实现方式,在Java 5之后才支持。
@Component
public enum SingletonClass {
INSTANCE;
public void doSomething() {
// TODO: Implementation goes here...
}
}
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`isbn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`author` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`publisher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`pubdate` datetime NOT NULL,
`price` decimal(10, 2) NOT NULL,
`id` int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`, `isbn`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('9780439227148', 'The Call of the Wild', 'Jack London', 'Scholastic Press', '2001-01-01 00:00:00', 39.40, 1);
INSERT INTO `book` VALUES ('9787501592401', 'The Old Man and the Sea', 'Ernest Hemingway', 'Knowledge Press', '2023-01-30 00:00:00', 25.80, 2);
INSERT INTO `book` VALUES ('9787501592401', 'The Old Man and the Sea', 'Ernest Hemingway', 'Knowledge Press', '2023-01-31 13:02:42', 25.80, 3);
INSERT INTO `book` VALUES ('9780439227148', 'The Call of the Wild', 'Jack London', 'Scholastic Press', '2023-01-30 16:00:00', 34.90, 6);
INSERT INTO `book` VALUES ('9781772262902', 'Oliver Twist', 'Charles Dickens', 'Engage Books', '2023-01-03 16:00:00', 45.00, 7);
下面代码演示单例模式在图书管理系统中的应用。
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {
// 单例模式
private static BookServiceImpl instance;
// 私有空参构造方法
private BookServiceImpl() { }
// 静态同步方法,确保线程安全同时实现懒汉式单例
public synchronized static BookServiceImpl getInstance() {
if (instance == null) {
instance = new BookServiceImpl();
}
return instance;
}
@Override
public List<Book> listAll() {
// 调用基类提供的list()方法获取所有书籍列表
return this.list();
}
}
在这里,我们使用了懒汉式单例模式来确保只有一个BookServiceImpl对象存在。这通过在类上定义一个static变量instance、设定私有的空参构造函数和实现getInstance()方法来实现。
当第一次调用getInstance()方法时,会检查static变量instance是否为空。如果为空,就创建一个新的BookServiceImpl对象,并将其赋给instance,然后返回这个新创建的对象。如果不为空,直接返回已有的对象,从而实现单例模式。在多线程情况下,通过添加synchronized关键字,可以确保getInstance()方法的线程安全性。
在本例中,我们对服务实现层进行优化,使其每次访问数据库时只需要使用同一个对象,避免了多次创建和销毁对象的开销。
除了使用单例模式,我们还继承了Mybatis Plus提供的IService接口,这使得服务层实现能够快速地进行数据访问和管理。例如,在本例中,我们可以通过调用基类中提供的list()方法轻松地获取数据库中所有书籍的列表。