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();
    }
}