PHP 实现简单工厂,工厂模式

133 阅读2分钟

简单工厂并不是23种设计模式里的。但还是一步一步来看一下吧。 只需要抽象一个产品类,各种产品实现。然后在一个简单工厂类里根据产品类型返回不同的产品对象。
这里的工厂是一个具体的类,非接口,非抽象类,一般利用if或者switch创建产品并返回。
但是扩展性差,要增加一个产品就得修改工厂类方法。

<?php

abstract class Car
{
    public abstract function show();
}

class BenzCar extends Car
{
    public function show()
    {
        echo "造了一台大奔".PHP_EOL;
    }
}

class BmwCar extends Car
{
    public function show()
    {
        echo "造了一台宝马".PHP_EOL;
    }
}

class TelsaCar extends Car
{
    public function show()
    {
        echo "造了一台特斯拉".PHP_EOL;
    }
}

class SimpleCarFactory
{
    public static function createCar(Car $car)
    {
        $car = get_class($car);
        switch ($car) {
            case 'TelsaCar': return new TelsaCar();
            case 'BmwCar': return new BmwCar();
            case 'BenzCar': return new BenzCar();
        }
    }
}

$car = SimpleCarFactory::createCar(new TelsaCar());
$car1 = SimpleCarFactory::createCar(new BmwCar());
$car2 = SimpleCarFactory::createCar(new BenzCar());
$car->show();
$car1->show();
$car2->show();

?>

接着就出现了工厂方法模式
工厂模式一般需要提供一个工厂接口,用于创建产品。
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

<?php

//工厂方法
abstract class Factory
{
    abstract function create();
}

class FactoryA extends Factory
{
    public function create()
    {
        $product = new ProductA();
        return $product->show();
    }
}
class FactoryB extends Factory
{
    public function create()
    {
        $product = new ProductB();
        return $product->show();    
    }
}

class FactoryC extends Factory
{
    public function create()
    {
        $product = new ProductC();
        return $product->show();    }
}

abstract class Product
{
    abstract function show();
}

class ProductA extends Product
{
    public function show()
    {
        echo "creating product A...";
    }
}

class ProductB extends Product
{
    public function show()
    {
        echo "creating product B...";
    }
}

class ProductC extends Product
{
    public function show()
    {
        echo "creating product C...";
    }
}

$factory = new FactoryA();
$factory->create();
$factory = new FactoryB();
$factory->create();
$factory = new FactoryC();
$factory->create();

现在创建了多个工厂实例,分别生产不同的产品。要增加一种新产品的时候只需要新实现一个工厂类,产品类即可。
当然了,上面的工厂还可以通过参数化达到一个工厂生产多个产品。

class FactoryNB extends Factory
{
    public function create(Product $product)
    {
    	$product = get_class($product);
    	switch ($product) {
    		case 'ProductA':
    		$product = new ProductA();
    		break;
    		case 'ProductB':
    		$product = new ProductB();
    		break;
        	case 'ProductC':
    		$product = new ProductC();
    		break;
    	}

    	return $product->show();    
    }
}

这样只需要传递一个具体的产品示例,使用同一个工厂即可生产多种产品。

抽象工厂待续。。。。