协变与工厂方法设计模式

Published on:

协变的概念#

协变使子类比父类方法能返回更具体的类型;
通俗点说就是如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的。

协变与工厂方法模式#

工厂方法模式的特点是一个工厂生产一种产品,有多少个产品就需要有多少个工厂。

基类工厂定义了操作方法和返回值,子类工厂继承自基类工厂,并且重写了操作方法,根据具体的工厂返回实际的类型。

以下代码定义了两个产品类(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.