目的:将调用者与创建者分离,调用者直接通过调用工厂,减少代码耦合,实现组件的封装,提高系统的可维护性和扩展性。
简单模式的结构(所需类):
1.接口类(用来限定子类的实现方法)
<?php
namespace Factory\SimpleFactory;
interface InterfaceTiger{
public function name();
}
2.具体实现子类
namespace Factory\SimpleFactory;
class HuananTiger implements IShape
{
public function name()
{
return '华南虎';
}
}
class DongbeiTiger implements IShape
{
public function name()
{
return '东北虎';
}
}
3.工厂类(简单工厂)
<?php
namespace Factory\SimpleFactory;
class SimpleFactory{
public static function getTigerName($type)
{
if ($type == 'huanan') {
return new HuananTiger ();
} elseif ($type == 'dongbei') {
return new DongbeiTiger ();
} else {
throw new Exception('Error tigertype', 1);
}
}
}
4.客户端调用
$tiger_name = SimpleFactory::getTigerName('huanan')->name();
echo $tiger_name; //华南虎
综上可以看出,简单模式架构:
1.客户端调用功能API(例如:支付功能,验证账号的合法性、检查支付环境的安全性、验证支付密码、从账号里扣款、通知用户支付结果等功能)
2.Impl 具体实现API功能的类(例如:支付宝支付,微信支付,QQ支付…多个实现类)
3.工厂(根据客户端返回对应的接口对象)
4.客户端通过Factory 获取指定实现类,进行面向对象编程。
缺点:如果增加类的实现,将会对工厂类进行对应的修改,违反了设计模式中的开闭原则(对于扩展代码开放,对于类内修改关闭)
问题:1.现在已经实现了 支付宝支付,微信支付,现在需要加一个QQ钱包支付,一个连连支付等。是不是需要修改SimpleFactory 中的判断?这样造成维护的后果是什么呢?