简单工厂并不是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();
}
}
这样只需要传递一个具体的产品示例,使用同一个工厂即可生产多种产品。
抽象工厂待续。。。。