创建型模式
工厂方法模式和抽象工厂模式的核心区别
工厂方法模式利用继承,抽象工厂模式利用组合
工厂方法模式产生一个对象,抽象工厂模式产生一族对象
工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象
工厂方法模式可以退化为简单工厂模式(非23中GOF)
<?php
namespace factory;
/**
* 动物接口
*/
interface AnimalInterface
{
}
<?php
namespace factory;
/**
* 实体鸡
*
*/
class Chicken implements AnimalInterface
{
/**
* 构造函数
*/
public function __construct()
{
echo "生产了一只鸡~ \n";
}
}
<?php
namespace factory;
/**
* 实体猪
*
*/
class Pig implements AnimalInterface
{
/**
* 构造函数
*/
public function __construct()
{
echo "生产了一只猪~ \n";
}
}
<?php
namespace factory;
interface Factory {
public function produce();
}
<?php
namespace factory;
/**
* 农场
*
* 生产动物
*/
class Farm implements Factory
{
/**
* 构造函数
*/
public function __construct()
{
echo "初始化了一个农场~ \n";
}
/**
* 生产方法
*
* 生产动物
* @param string $type 动物类型
* @return mixed
*/
public function produce($type='')
{
switch ($type) {
case 'chicken':
return new Chicken();
break;
case 'pig':
return new Pig();
break;
default:
echo "该农场不支持生产该农物~ \n";
break;
}
}
}
<?php
namespace factory;
/**
* 动物园
*
* 生产动物
*/
class Zoo implements Factory
{
/**
* 构造函数
*/
public function __construct()
{
echo "初始化了一个动物园~ \n";
}
/**
* 生产方法
*
* 生产动物
* @param string $type 动物类型
* @return mixed
*/
public function produce($type='')
{
switch ($type) {
case 'chicken':
return new Chicken();
break;
case 'pig':
return new Pig();
break;
default:
echo "该农场不支持生产该农物~ \n";
break;
}
}
}
<?php
namespace factory;
/**
* 简单动物工厂
* 无须实现动物工厂接口
* 生产动物
*/
class SampleFactory
{
/**
* 生产方法
*
* 生产动物
* @param string $type 动物类型
* @return mixed
*/
public static function produce($type='')
{
switch ($type) {
case 'chicken':
return new Chicken();
break;
case 'pig':
return new Pig();
break;
default:
echo "该农场不支持生产该农物~ \n";
break;
}
}
}
<?php
// 注册自加载
spl_autoload_register('autoload');
function autoload($class)
{
require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}
/************************************* test *************************************/
use factory\Farm;
use factory\Zoo;
use factory\SampleFactory;
// 初始化一个工厂
$farm = new Farm();
// 生产一只鸡
$farm->produce('chicken');
// 生产一只猪
$farm->produce('pig');
// 初始化一个动物园工厂
$zoo = new Zoo();
$zoo->produce("chicken");
$zoo->produce("pig");
// 工厂方法模式退化为简单工厂模式
SampleFactory::produce("chicken");
SampleFactory::produce("pig");
















