工厂模式
特点
在不修改源代码的情况下可以添加新的模块、符合开闭原则,但是新模块添加的时候需要添加具体的模块类以及对应的工厂类
只能生产相同种类的实例,比如肉类工厂、蔬菜工厂、冰箱工厂......针对某种类型的专业工厂并非综合工厂(抽象工厂
)什么都可以加工
角色
-
抽象工厂
-
具体工厂
-
抽象产品
-
具体产品
UML图
image.png应用场景
模块与模块之间衔接的地方可以考虑使用
个人思考:使用Ioc是不是会更好
但工厂方法会制造更多同类型(实现同一接口)的实例,Ioc 是同一个类型实例
代码演示
<?php
interface Platform
{
public function show();
}
interface PlatformFactory
{
public function get(): Platform;
}
class PlatformAFactory implements PlatformFactory
{
public function get(): Platform
{
return new PlatformA();
}
}
class PlatformA implements Platform
{
public function __construct()
{
echo "制造PlatformA" . PHP_EOL;
}
public function show()
{
echo "PlatformA show" . PHP_EOL;
}
}
class PlatformBFactory implements PlatformFactory
{
public function get(): Platform
{
return new PlatformB();
}
}
class PlatformB implements Platform
{
public function __construct()
{
echo "制造PlatformA" . PHP_EOL;
}
public function show()
{
echo "PlatformB show" . PHP_EOL;
}
}
class App
{
public static function run(PlatformFactory $pf)
{
# 这里 不管你传递的是哪个工厂,只要实现了PlatformFactory
# 就可以调用show方法 不必关心哪个工厂
$pf->get()->show();
}
}
App::run(new PlatformAFactory());
App::run(new PlatformBFactory());
简单IOC
写下来方便对比
<?php
class Ioc
{
private static $parsed;
private static $bind;
public static function get(string $name)
{
if(empty(self::$parsed[$name])) {
self::$parsed[$name] = call_user_func(self::$bind[$name]);
}
return self::$parsed[$name];
}
public static function set(string $name, Closure $closure)
{
self::$bind [$name] = $closure;
}
}
网友评论