抽象工廠常需全域唯一實例(如配置驅動的工廠),單例模式可確保工廠實例唯一,避免重複初始化資源。
abstract class AbstractProductA { abstract void doSomething(); }
abstract class AbstractProductB { abstract void doSomething(); }
class ProductA1 extends AbstractProductA { void doSomething() { System.out.println("A1"); } }
class ProductA2 extends AbstractProductA { void doSomething() { System.out.println("A2"); } }
class ProductB1 extends AbstractProductB { void doSomething() { System.out.println("B1"); } }
class ProductB2 extends AbstractProductB { void doSomething() { System.out.println("B2"); } }
abstract class AbstractFactory {
abstract AbstractProductA createProductA();
abstract AbstractProductB createProductB();
}
class Factory1 extends AbstractFactory {
AbstractProductA createProductA() { return new ProductA1(); }
AbstractProductB createProductB() { return new ProductB1(); }
}
class Factory2 extends AbstractFactory {
AbstractProductA createProductA() { return new ProductA2(); }
AbstractProductB createProductB() { return new ProductB2(); }
}
public final class FactoryProvider {
private static final FactoryProvider INSTANCE = new FactoryProvider();
private AbstractFactory currentFactory;
private FactoryProvider() {} // 私有建構子
public static FactoryProvider getInstance() { return INSTANCE; }
// 依配置切換工廠(運行期僅一個實例)
public synchronized void setFactory(String type) {
switch (type) {
case "type1": currentFactory = new Factory1(); break;
case "type2": currentFactory = new Factory2(); break;
default: throw new IllegalArgumentException("Unknown: " + type);
}
}
public AbstractFactory getFactory() {
if (currentFactory == null) throw new IllegalStateException("Factory not initialized");
return currentFactory;
}
}
public class Client {
public static void main(String[] args) {
// 系統啟動時依配置初始化一次
FactoryProvider.getInstance().setFactory("type1");
// 業務代碼僅依賴抽象
AbstractFactory factory = FactoryProvider.getInstance().getFactory();
AbstractProductA a = factory.createProductA();
AbstractProductB b = factory.createProductB();
a.doSomething(); // 輸出:A1
b.doSomething(); // 輸出:B1
}
}
FactoryProvider 單例確保配置一致性,避免多處 new Factory 導致不一致。setFactory() 允許熱切換產品族(如多租戶、多環境)。AbstractFactory,符合 DIP。FactoryProvider 確保線程安全。setFactory() 加 synchronized 保證切換原子性。單例模式為抽象工廠提供「全域唯一配置入口」,兩者結合實現「產品族集中管理、運行期可切換、客戶端零依賴具體類」的靈活架構,常見於多租戶、多資料源、跨平台適配等場景。