Java设计模式详解:单例模式与工厂模式

需积分: 50 5 下载量 167 浏览量 更新于2024-07-16 收藏 414KB PDF 举报
"这份PDF详细阐述了Java中的23种设计模式,提供了每种模式的简要介绍和示例。" 在设计模式的世界里,单例模式(Singleton Pattern)是其中一个基础且重要的模式,它的核心目标是确保一个类在整个应用程序中只存在一个实例。如描述所示,通用的线程安全实现方式是通过私有构造函数防止外部直接实例化,并通过一个静态方法提供全局唯一的访问点。例如: ```java public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() {} public static Singleton getSingleton() { return singleton; } public static void doSomething() {} } ``` 这种实现方式在类加载时即创建了单例,因此是线程安全的。然而,如果不希望在类加载时就创建实例,可以使用懒汉式实现,但需要注意线程同步问题。如下面的非线程安全示例: ```java public class Singleton { private static Singleton singleton = null; private Singleton() {} public static synchronized Singleton getSingleton() { if (singleton == null) { singleton = new Singleton(); } return singleton; } // ... } ``` 这里,`getSingleton` 方法加了 `synchronized` 关键字以确保多线程环境下的安全。但同步操作会带来性能影响,因此可以优化为双重检查锁定(Double-Check Locking)模式,以减少同步开销: ```java public class Singleton { private volatile static Singleton singleton = null; private Singleton() {} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } // ... } ``` 接下来是工厂模式(Factory Pattern),它是创建型设计模式的一种,用于提供创建对象的接口,而隐藏实际的创建过程。工厂模式让类的实例化延迟到子类中进行,这样可以解耦产品类和客户端之间的关系。例如,我们可以定义一个抽象工厂接口: ```java public abstract class AbstractFactory { public abstract Product createProduct(); } public class ConcreteFactory1 extends AbstractFactory { @Override public Product createProduct() { return new Product1(); } } public class ConcreteFactory2 extends AbstractFactory { @Override public Product createProduct() { return new Product2(); } } ``` 在这个例子中,`AbstractFactory` 是工厂接口,`ConcreteFactory1` 和 `ConcreteFactory2` 是具体的工厂实现,它们分别创建 `Product1` 和 `Product2` 类的实例。 设计模式不仅仅是代码实现,更是一种软件设计思想的体现。通过合理地应用设计模式,可以提高代码的可读性、可维护性和复用性,从而提升软件系统的整体质量。在Java开发中,熟悉并掌握这些设计模式对于成为一名优秀的程序员至关重要。