https://juejin.cn/post/7325069743143157801
单例模式和工厂模式确实可以结合使用。单例模式用于确保某个类只有一个实例,而工厂模式用于创建对象,尤其是当对象的创建过程复杂或需要依赖注入时。将这两个模式结合使用时,通常是希望通过工厂方法或抽象工厂来创建一个单例对象。
以下是一个简单的例子展示了如何将单例模式与工厂模式结合:
这里,我们定义一个工厂接口,以及一个具体的工厂类,这个具体的工厂类是单例的。
// 工厂接口
public interface ProductFactory {
Product createProduct();
}
// 单例的具体工厂
public class SingletonProductFactory implements ProductFactory {
private static SingletonProductFactory instance;
private SingletonProductFactory() {
// 私有构造函数,防止外部直接创建实例
}
public static synchronized SingletonProductFactory getInstance() {
if (instance == null) {
instance = new SingletonProductFactory();
}
return instance;
}
@Override
public Product createProduct() {
// 实现创建产品实例的逻辑
return new ConcreteProduct();
}
}
// 产品接口
public interface Product {
void use();
}
// 具体产品类
public class ConcreteProduct implements Product {
@Override
public void use() {
// 具体使用产品的逻辑
}
}
在这个示例中,SingletonProductFactory
是一个单例,可以用来创建Product
实例。通过确保SingletonProductFactory
是单例的,我们能保障全局只有一个工厂实例在创建产品实例,这对于管理资源和配置很有用。
另一种结合这两个模式的方式是在单例中使用工厂方法来创建对象。这种情况下,单例类自己内部可能需要创建一些复杂对象,使用工厂方法可以使单例类的代码更加清晰。
// 单例类
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 私有构造函数
}
public static Singleton getInstance() {
return instance;
}
// 工厂方法
public Product createProduct() {
// 创建产品的逻辑
return new ConcreteProduct();
}
}