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);