协变的概念
协变使子类比父类方法能返回更具体的类型;
通俗点说就是如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的。
协变与工厂方法模式
工厂方法模式的特点是一个工厂生产一种产品,有多少个产品就需要有多少个工厂。
基类工厂定义了操作方法和返回值,子类工厂继承自基类工厂,并且重写了操作方法,根据具体的工厂返回实际的类型。
以下代码定义了两个产品类(ShoesBasketball,ShoesRunning),
两个工厂子类(FactoryBasketball,FactoryRunning)。
产品类实现自产品接口(Shoes),产品接口定义了一个方法(whoami)。
工厂子类继承自工厂基类(Factory),工厂基类定义了一个操作方法(makeShoes),并且定义了返回值类型(Shoes)。
工厂子类重写方法(makeShoes),并且定义了比父类更加具体的返回值类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <?php interface Shoes { public function whoami(); }
class ShoesBasketball implements Shoes { public function whoami() { return "I am Basketball shoes."; } }
class ShoesRunning implements Shoes { public function whoami() { return "I am Running shoes."; } }
interface Factory { public static function makeShoes():Shoes; } class FactoryBasketball implements Factory { public static function makeShoes():ShoesBasketball { return new ShoesBasketball(); } } class FactoryRunning implements Factory { public static function makeShoes():ShoesRunning { return new ShoesRunning(); } }
$shoes = FactoryBasketball::makeShoes(); echo $shoes->whoami(); $shoes = FactoryRunning::makeShoes(); echo $shoes->whoami();
|
结果输出
1
| I am Basketball shoes.I am Running shoes.
|