抽象工厂模式是一种创建型设计模式,它提供一个接口用于创建一系列相关或依赖对象的家族,而不需要指定它们的具体类。以下是一个简单的 PHP 抽象工厂模式的示例:
// 抽象产品A
interface AbstractProductA {
    public function getName();
}

// 具体产品A1
class ConcreteProductA1 implements AbstractProductA {
    public function getName() {
        return "Product A1";
    }
}

// 具体产品A2
class ConcreteProductA2 implements AbstractProductA {
    public function getName() {
        return "Product A2";
    }
}

// 抽象产品B
interface AbstractProductB {
    public function getName();
}

// 具体产品B1
class ConcreteProductB1 implements AbstractProductB {
    public function getName() {
        return "Product B1";
    }
}

// 具体产品B2
class ConcreteProductB2 implements AbstractProductB {
    public function getName() {
        return "Product B2";
    }
}

// 抽象工厂接口
interface AbstractFactory {
    public function createProductA(): AbstractProductA;
    public function createProductB(): AbstractProductB;
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    public function createProductA(): AbstractProductA {
        return new ConcreteProductA1();
    }

    public function createProductB(): AbstractProductB {
        return new ConcreteProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    public function createProductA(): AbstractProductA {
        return new ConcreteProductA2();
    }

    public function createProductB(): AbstractProductB {
        return new ConcreteProductB2();
    }
}

// 客户端代码
$factory1 = new ConcreteFactory1();
$productA1 = $factory1->createProductA();
$productB1 = $factory1->createProductB();

$factory2 = new ConcreteFactory2();
$productA2 = $factory2->createProductA();
$productB2 = $factory2->createProductB();

// 输出产品的名称
echo $productA1->getName();  // 输出 "Product A1"
echo $productB1->getName();  // 输出 "Product B1"

echo $productA2->getName();  // 输出 "Product A2"
echo $productB2->getName();  // 输出 "Product B2"

在这个例子中,AbstractFactory 接口声明了创建一系列相关产品的方法,而 ConcreteFactory1 和 ConcreteFactory2 分别实现了这个接口,负责创建具体的产品。每个具体工厂创建一组相关的产品,比如 ConcreteFactory1 创建了 ConcreteProductA1 和 ConcreteProductB1。

这种方式下,客户端可以通过选择不同的具体工厂来获取不同风格的产品,而不必关心具体产品的创建细节。这使得系统更加灵活,易于扩展。


转载请注明出处:http://www.zyzy.cn/article/detail/11931/PHP