介绍
静态工厂模式又叫做简单工厂模式,工厂模式是最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,其核心用法就是根据不同的参数获得不同类的方法就是其设计思想.
优缺点
优点
- 一个调用者想创建一个对象,只要知道其名称就可以.
- 扩展性高,新增加一个产品,只要扩展一个工厂类就可以.
- 屏蔽产品的具体实现,调用者只关心产品的接口.
- 修改类名,只需修改工厂模式里的类名即可.
缺点
工厂模式缺点是违反了高内聚原则,将全部逻辑都集中在一个工厂类中.当需要添加新的类,就要改变工厂类,增加了系统的复杂度,对于维护不利,同时也增加了系统具体类的依赖.
演示
创建接口
// 定义英灵从者接口
interface Servant
{
// 防御
function Defense($servant);
// 攻击
function Attack($servant);
// 撤退
function Retreat($servant);
}
创建接口实现类
// 定义saber类 实现英灵接口
class Saber implements Servant
{
public function __construct()
{
echo 'Servant ' . __CLASS__ . ' 遵从召唤而来' . PHP_EOL;
}
public function Defense($servant)
{
echo 'Servant ' . $servant . '进入防御状态' . PHP_EOL;
}
public function Attack($servant)
{
echo 'Servant ' . $servant . '使用剑发起攻击' . PHP_EOL;
}
function Retreat($servant)
{
echo 'Servant ' . $servant . '开始撤退' . PHP_EOL;
}
}
// 定义Archer类 实现英灵接口
class Archer implements Servant
{
public function __construct()
{
echo 'Servant ' . __CLASS__ . ' 遵从召唤而来' . PHP_EOL;
}
public function Defense($servant)
{
echo 'Servant ' . $servant . '进入防御状态' . PHP_EOL;
}
public function Attack($servant)
{
echo 'Servant ' . $servant . '使用弓箭发起攻击' . PHP_EOL;
}
function Retreat($servant)
{
echo 'Servant ' . $servant . '开始撤退' . PHP_EOL;
}
}
// 定义Fail类 实现英灵接口
class Fail implements Servant
{
public function __construct()
{
echo 'Servant 召唤失败' . PHP_EOL;
}
public function Defense($servant)
{
echo '未召唤成功' . PHP_EOL;
}
public function Attack($servant)
{
echo '未召唤成功' . PHP_EOL;
}
function Retreat($servant)
{
echo '未召唤成功' . PHP_EOL;
}
}
创建工厂
// 创建工厂
class Factory
{
static public function factor($type)
{
// 首字母大写
$type = ucfirst($type);
// 判断类是否存在
if(class_exists($type)){
return new $type;
}
return new Fail();
}
}
演示
// 调用测试
Factory::factor('saber')->Attack('兰斯洛特');
Factory::factor('Lancer')->Attack('斯卡哈');
// 执行输出
Servant Saber 遵从召唤而来
Servant 兰斯洛特使用剑发起攻击
Servant 召唤失败
未召唤成功