【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
假设你正在开发一款物流管理应用。最初版本只能处理卡车运输,因此大部分代码都在位于名为卡车的类中。 一段时间后, 这款应用变得极受欢迎。你每天都能收到十几次来自海运公司的请求,希望应用能够支持海上物流功能。
//工厂方法模式
abstract class Logistics {
abstract function createTransport(): Transport;
//交付
public function deliver() {
$obj = $this->createTransport();
$obj->deliver();
}
}
//公路运输
class RoadLogistics extends Logistics {
public function createTransport(): Transport {
return new Truck();
}
}
//海洋运输
class SeaLogistics extends Logistics {
public function createTransport(): Transport {
return new Ship();
}
}
//运输
interface Transport {
public function deliver();
}
//卡车运输
class Truck implements Transport {
public function deliver() {
echo '卡车走陆路交付货物';
}
}
//船运输
class Ship implements Transport {
public function deliver() {
echo '轮船走海路交付货物';
}
}
$roadClient = new RoadLogistics();
$roadClient->deliver();
echo '<br/>';
$seaClient = new SeaLogistics();
$seaClient->deliver();
//tips: 工厂方法一般返回的对象通常叫做产品
//tips2: 有一个轻微的限制:子类仅在这些产品具有相同的基类或接口时才可以返回不同类型的产品。同样,基类中的factory方法应将其返回类型声明为此接口。
来源:oschina
链接:https://my.oschina.net/hackdebug/blog/3147319