专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

简单工厂并不是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):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

65_1.png

<?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();    
    }
}

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

抽象工厂待续。。。。

文章永久链接:https://tech.souyunku.com/45224

未经允许不得转载:搜云库技术团队 » PHP 实现简单工厂,工厂模式

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们