php实现工厂模式

工厂模式简介
工厂模式是一种创建型设计模式,用于在不暴露创建逻辑的情况下创建对象。通过定义一个公共接口或抽象类,让子类决定实例化哪个类。
简单工厂模式实现
<?php
interface Product {
public function getName();
}
class ConcreteProductA implements Product {
public function getName() {
return "Product A";
}
}
class ConcreteProductB implements Product {
public function getName() {
return "Product B";
}
}
class SimpleFactory {
public function createProduct($type) {
switch ($type) {
case 'A':
return new ConcreteProductA();
case 'B':
return new ConcreteProductB();
default:
throw new InvalidArgumentException("Unknown product type");
}
}
}
$factory = new SimpleFactory();
$productA = $factory->createProduct('A');
echo $productA->getName(); // 输出: Product A
?>
工厂方法模式实现
<?php
interface Product {
public function getName();
}
class ConcreteProductA implements Product {
public function getName() {
return "Product A";
}
}
class ConcreteProductB implements Product {
public function getName() {
return "Product B";
}
}
abstract class Creator {
abstract protected function factoryMethod();
public function someOperation() {
$product = $this->factoryMethod();
return $product->getName();
}
}
class ConcreteCreatorA extends Creator {
protected function factoryMethod() {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
protected function factoryMethod() {
return new ConcreteProductB();
}
}
$creatorA = new ConcreteCreatorA();
echo $creatorA->someOperation(); // 输出: Product A
?>
抽象工厂模式实现
<?php
interface AbstractProductA {
public function getName();
}
interface AbstractProductB {
public function getName();
}
class ConcreteProductA1 implements AbstractProductA {
public function getName() {
return "Product A1";
}
}
class ConcreteProductB1 implements AbstractProductB {
public function getName() {
return "Product B1";
}
}
class ConcreteProductA2 implements AbstractProductA {
public function getName() {
return "Product A2";
}
}
class ConcreteProductB2 implements AbstractProductB {
public function getName() {
return "Product B2";
}
}
interface AbstractFactory {
public function createProductA();
public function createProductB();
}
class ConcreteFactory1 implements AbstractFactory {
public function createProductA() {
return new ConcreteProductA1();
}
public function createProductB() {
return new ConcreteProductB1();
}
}
class ConcreteFactory2 implements AbstractFactory {
public function createProductA() {
return new ConcreteProductA2();
}
public function createProductB() {
return new ConcreteProductB2();
}
}
$factory1 = new ConcreteFactory1();
$productA1 = $factory1->createProductA();
echo $productA1->getName(); // 输出: Product A1
?>
使用场景建议
简单工厂模式适用于对象创建逻辑不复杂的场景。工厂方法模式将实例化推迟到子类,更符合开闭原则。抽象工厂模式适合创建一系列相关或依赖的对象家族。
注意事项
工厂模式会增加代码复杂度,应仅在对象创建逻辑确实需要封装时使用。避免过度设计,简单的new操作可能更合适简单场景。







