// 抽象产品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