工厂模式与抽象工厂模式
以下是用PHP实现工厂模式和抽象工厂模式的代码示例,并对它们的区别进行比较。
工厂模式 (Factory Pattern)
// 产品接口
interface Product {
public function operation();
}
// 具体产品A
class ProductA implements Product {
public function operation() {
return "ProductA operation";
}
}
// 具体产品B
class ProductB implements Product {
public function operation() {
return "ProductB operation";
}
}
// 工厂
class ProductFactory {
public static function createProduct($type) {
switch ($type) {
case 'A':
return new ProductA();
case 'B':
return new ProductB();
default:
throw new Exception("Invalid product type");
}
}
}
// 使用工厂模式
$product = ProductFactory::createProduct('A');
echo $product->operation(); // 输出: ProductA operation
抽象工厂模式 (Abstract Factory Pattern)
// 产品接口
interface Product {
public function operation();
}
// 具体产品A
class ProductA implements Product {
public function operation() {
return "ProductA operation";
}
}
// 具体产品B
class ProductB implements Product {
public function operation() {
return "ProductB operation";
}
}
// 抽象工厂接口
interface AbstractFactory {
public function createProductA();
public function createProductB();
}
// 具体工厂实现
class ConcreteFactory implements AbstractFactory {
public function createProductA() {
return new ProductA();
}
public function createProductB() {
return new ProductB();
}
}
// 使用抽象工厂模式
$factory = new ConcreteFactory();
$productA = $factory->createProductA();
$productB = $factory->createProductB();
echo $productA->operation(); // 输出: ProductA operation
echo $productB->operation(); // 输出: ProductB operation
工厂模式和抽象工厂模式的区别
特性 | 工厂模式 | 抽象工厂模式 |
---|---|---|
目的 | 用于创建单一类型的具体产品。 | 用于创建多个相关的产品家族。 |
灵活性 | 需要修改工厂代码以支持新的产品类型(通过扩展 switch 或 if)。 | 增加新的产品家族时更容易扩展(通过创建新的工厂实现)。 |
复杂性 | 简单,易于实现。 | 比工厂模式复杂,需要定义更多的接口和类。 |
使用场景 | 适用于简单场景,例如仅有一两个产品。 | 适用于需要创建多个相关产品的复杂场景,例如 GUI 工具集(按钮、菜单等)。 |
总结来说,工厂模式更简单但不适用于复杂的产品家族结构,而抽象工厂模式适用于需要管理多个相关产品的场景。可以根据实际需求选择合适的设计模式!如果还有其他疑问,请告诉我 😊。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: