PHP

什么是工厂模式? 在什么地方可以用到工厂模式?

什么是工厂模式? 在什么地方可以用到工厂模式?

Posted by 大可乐 on November 29, 2018

什么是工厂模式? 在什么地方可以用到工厂模式?

什么是工厂模式

​ 工厂模式和生产有关。生产什么呢?生产出来的是一个 实例对象 。通过一个工厂类生产。怎么生产呢?工厂类调用自身静态方法来生产对象实例

工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法可以任意命名,这个静态还可以接受任意数据的参数,必须返回一个对象。

为什么要用工厂模式?

​ 很多没接触过工厂模式的人会不禁问,为啥我要费这么大的劲儿去构造工厂类去 创建对象 呢?不去套用那些易维护,可扩展之类的话,我们可以考虑这样一个简单的问题。如果项目中,我们通过一个类创建对象。再快完成或者已经完成,要扩展功能的时候,发现原来的类名不是很合适了或者发现类需要添加构造函数参数 才能实现功能扩展。我靠!我都通过这个类创建了一大堆对象实例了啊,难道我还要一个一个去改不成?我们现在才感受到了“高内聚低耦合”的博大精深。没问题,工厂方法可以解决这个问题。

工厂模式如何实现?

​ 相对于单例模式,上面我们提供了足够的信息,工厂类,工厂类里面的静态方法。静态方法里面new一下需要创建的对象实例就搞定了。当然至于考虑上面的第二个问题,根据工厂类静态方法的参数,我们简单做个判断就好了。管你用if…else…还是switch…case…,能够快速高效完成判断该创建哪个类的工作就好了。最后工厂类静态方法,返回的一定是一个对象,是一个

基本的工厂类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//要创建对象示例的类
class MyObject
{
    
}

//工厂类
class MyFactory
{
    public static function factory()
    {
        return new MyObject();
    }
}

$instance = MyFactory::factory();

一个稍微复杂的工厂模式

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
46
47
48
49
50
51
52
<?php
interface Transport
{
    public function go();
}

class Bus implements Transport
{
    public function go()
    {
        echo "bus每一站都停";
    }
}

class Car implements Transport
{
    public function go()
    {
        echo "car跑的很快";
    }
}

class Bike implements Transport
{
    public function go()
    {
        echo "Bike跑的很慢";
    }
}

//工厂类
class TransFactory
{
    public static function factory($transport)
    {
        switch($transport)
        {
            case 'bus':
                return new Bus();
            	break;
            case 'car':
                return new Car();
                break;
            case 'bike':
                return new Bike();
                break;
        }
    }
    $transport = transFactory::factory('car');
    $transport->go();
}