介绍

工厂实例推迟到子类实例化,从而避免了简单工厂模式对内部进行修改的问题。所以工厂方法模式就是让子类来做决定。

项目结构

UML

代码

Mouse.php

1
2
3
4
5
6
7
<?php


interface Mouse
{
public function click();
}

Factory.php

1
2
3
4
5
6
7
<?php


interface Factory
{
public function create();
}

WinMouse.php

1
2
3
4
5
6
7
8
9
10
11
<?php


class WinMouse implements Mouse
{

public function click()
{
return 'win mouse click';
}
}

MacMouse.php

1
2
3
4
5
6
7
8
9
10
11
<?php


class MacMouse implements Mouse
{

public function click()
{
return 'mac mouse click';
}
}

WinFactory.php

1
2
3
4
5
6
7
8
9
10
11
<?php


class WinFactory implements Factory
{

public function create()
{
return new WinMouse();
}
}

MacFactory.php

1
2
3
4
5
6
7
8
9
10
11
<?php


class MacFactory implements Factory
{

public function create()
{
return new WinMouse();
}
}

总结

① 定义了一个创建对象的接口,但由子类来决定实例化哪一个,工厂方法让类把实例化推迟到子类
② 工厂方法就是抽象类提供的一个创建对象的方法的接口

设计原则之一:要依赖抽象,不要依赖具体类;不管高层或底层组件,都应该依赖于抽象