抽象工厂模式

79 阅读1分钟

php抽象工厂模式
说说我理解的工厂模式和抽象工厂模式的区别:
工厂就是一个独立公司,负责生产对象;
抽象工厂就是集团,负责生产子公司(工厂);

<?php
namespace factoryAbstract;

interface Factory {
    public function createFarm();
    public function createZoo();
}
<?php
namespace factoryAbstract;

class AnimalFactory implements Factory
{
    public function createFarm()
    {
        return new PigFarm();
    }

    public function createZoo()
    {
        return new PandaZoo();
    }
}
<?php
namespace factoryAbstract;

class PlantFactory implements Factory
{
    public function createFarm()
    {
        return new RiceFarm();
    }

    public function createZoo()
    {
        return new PeonyZoo();
    }
}
<?php
namespace factoryAbstract;

Interface Income {
    public function money();
}
<?php
namespace factoryAbstract;

/**
 * 农场接口
 */
interface FarmInterface extends Income
{
    public function harvest();
}
<?php
namespace factoryAbstract;

class PigFarm implements FarmInterface {

    public function harvest()
    {
        echo "养殖部门收获猪肉(不清真)\n";
    }

    public function money()
    {
        $this->harvest();
        echo "卖猪肉\n\n";
    }
}
<?php
namespace factoryAbstract;

class RiceFarm implements FarmInterface
{
    public function harvest()
    {
        echo "种植部门收获大米\n";
    }

    public function money()
    {
        $this->harvest();
        echo "卖大米\n\n";
    }
}
<?php
namespace factoryAbstract;

/**
 * 动物园接口
 */
interface ZooInterface extends Income
{
    public function show();
}
<?php
namespace factoryAbstract;

class PandaZoo implements ZooInterface {

    public function show()
    {
        echo "熊猫园开馆\n";
    }

    public function money()
    {
        $this->show();
        echo "卖门票\n\n";
    }
}
<?php
namespace factoryAbstract;
class PeonyZoo implements ZooInterface {

    public function show()
    {
        echo "牡丹园开馆\n";
    }

    public function money()
    {
        $this->show();
        echo "卖门票\n\n";
    }

}
<?php

// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

/************************************* test *************************************/

use factoryAbstract\AnimalFactory;
use factoryAbstract\PlantFactory;

// 初始化一个动物生产线, 包含了一族产品
$animal = new AnimalFactory();

// 初始化一个植物生产线, 包含了一族产品
$plant = new PlantFactory();

// 模拟调用, 抽象工厂模式核心是面向接口编程
function call(factoryAbstract\Factory $factory) {
    $earn = function(factoryAbstract\Income $income) {
        $income->money();
    };
    $earn($factory->createFarm());
    $earn($factory->createZoo());
}

call($animal);
call($plant);