单例模式(Singleton Pattern)
背景介绍:
在小胖子的程序世界里,披萨店的魅力愈发扩大,于是他们决定开设一个新的分店,名为“二店单例披萨屋”。小胖子的好基友猥琐和涛涛对这个新店充满期待,然而,与一店的成功不同,二店的披萨在制作过程中出现了问题。
设计模式应用:
懒汉式单例模式(线程安全)
小胖子和他的好基友们决定使用懒汉式单例模式,以确保他们在任何需要时都能够获得相同的披萨店实例。为了防止披萨店被盗,他们在店门口增加了一位保安,确保每个人都能够安全地进入。
代码示例:
public class LazyThreadSafeSingletonPizzaShop {
private static LazyThreadSafeSingletonPizzaShop instance;
private LazyThreadSafeSingletonPizzaShop() {
// 私有构造函数,防止外部实例化
}
public static synchronized LazyThreadSafeSingletonPizzaShop getInstance() {
if (instance == null) {
instance = new LazyThreadSafeSingletonPizzaShop();
}
return instance;
}
public String orderPizza(String flavor) {
return "一份特色披萨(" + flavor + "口味)出炉啦!";
}
}
// 测试用例
public class LazyThreadSafeSingletonPatternExample {
public static void main(String[] args) {
LazyThreadSafeSingletonPizzaShop pizzaShop = LazyThreadSafeSingletonPizzaShop.getInstance();
String orderResult = pizzaShop.orderPizza("意大利");
System.out.println(orderResult);
}
}
恶汉式单例模式(线程不安全)
然而,对于“一店单例披萨屋”,由于防盗措施不足,一名小偷成功潜入,导致披萨制作不安全。为了强调这一点,他们决定在新店中使用恶汉式单例模式。这时,由于一开始就有人入侵,整个制作过程都变得不可靠。
代码示例:
public class EagerThreadUnsafeSingletonPizzaShop {
private static EagerThreadUnsafeSingletonPizzaShop instance = new EagerThreadUnsafeSingletonPizzaShop();
private EagerThreadUnsafeSingletonPizzaShop() {
// 私有构造函数,防止外部实例化
}
public static EagerThreadUnsafeSingletonPizzaShop getInstance() {
return instance;
}
public String orderPizza(String flavor) {
return "一份特色披萨(" + flavor + "口味)出炉啦!";
}
}
// 测试用例
public class EagerThreadUnsafeSingletonPatternExample {
public static void main(String[] args) {
EagerThreadUnsafeSingletonPizzaShop pizzaShop = EagerThreadUnsafeSingletonPizzaShop.getInstance();
String orderResult = pizzaShop.orderPizza("墨西哥");
System.out.println(orderResult);
}
}
在这个例子中,恶汉式单例模式强调了一店披萨屋的不安全性,以及由于防盗不力导致的问题。这使得小胖子和他的好基友们更加珍惜懒汉式单例模式,因为它提供了更安全的披萨制作环境。
下一个设计模式是什么呢?