php设计模式之工厂(factory)模式

该模式属于创建型模式


说句老实话,工厂模式对于个人来说真没什么鸟用,就省了一个new而已,但是很多框架的源码里却随处可见工厂模式的身影。

一、什么是工厂模式?

从名字来看,似乎看不出什么端倪。工厂模式,和生产有关?还是和生产流程有关?难道还和工厂领导有关?和领导秘书有关?秘书... 好了不卖关子了,所谓工厂模式还真和生产有关。生产什么呢?生产出来的是一个实例对象。通过什么设备生产?通过一个工厂类生产。怎么生产呢?工厂类调用自身静态方法来生产对象实例


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

工厂模式的原理就是创建一个类(我们叫工厂类),这个类用来专业生产各个类的对象,做法很简单,在工厂类里写一个静态方法,这个静态方法接收一个参数,根据传进来的参数来确定到底是new那个类的对象。 


感觉上面说的很抽象 很专业?那用大白话来解释一下?如下:

就是负责创建其它对象的类或方法。

1、工厂模式大概步骤如下:

①、接口中定义一些方法。注:有的人可能不是使用的interface(接口)最终都要而是使用的abstract(抽象)也是可以的,反正最终都要实现接口类中的方法或抽象类中的抽象方法。

②、实现接口类中定义的接口方法

③、工厂类:用来创建对象


2、优缺点:

优点:为系统结构提供了灵活的动态扩展机制,降低了类之间的耦合度。方便维护

缺点:当要修改类的时候,工厂类也需要做出相对应的更改,违反了开闭原则(对于扩展代码开放,对于类内修改关闭)


工厂模式示例代码:

<?php

interface Skill
{
    public function family();
    public function buy();
}

class Person implements Skill
{
    public function family()
    {
        echo '人族在伐木<br/>';
    }

    public function buy()
    {
        echo '人族在使用人民币买东西<br/>';
    }
}

class Jingling implements Skill
{
    public function family()
    {
        echo '精灵族在伐木<br/>';
    }

    public function buy()
    {
        echo '精灵族在使用精灵币买东西<br/>';
    }
}

//工厂类,用来负责创建对象的
class Factory
{
    public static function createHero($type)
    {
        switch($type)
        {
            case 'person':
                return new Person();
            break;
            case 'jingling':
                return new Jingling();
            break;
        }
    }
}

//测试
$object = Factory::createHero('person');

$object->buy();

上面的代码就是一个简单通俗的工厂模式了


3、工厂方法模式(更进一步的工厂模式)

工厂方法模式的核心是工程类不再负责所有对象的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,它仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。


工厂方法模式示例代码:

<?php

interface Tell
{
    public function call();
    public function receive();
}

class XiaoMi implements Tell
{
    public function call()
    {
        echo '使用小米手机打电话<br/>';
    }

    public function receive()
    {
        echo '使用小米手机接电话<br/>';
    }
}

class HuaWei implements Tell
{
    public function call()
    {
        echo '使用华为手机打电话<br/>';
    }

    public function receive()
    {
        echo '使用华为手机接电话<br/>';
    }
}

//工厂类,只负责规定接口,不再负责创建对象。具体实现(创建对象等)操作交给子类
interface Factory
{
    public static function createPhone();
}

class XiaoMiFactory implements Factory
{
    public static function createPhone()
    {
        return new XiaoMi();
    }
}

//定义一个华为工厂类,来实现工厂类中的方法
class HuaWeiFactory implements Factory
{
    public static function createPhone()
    {
        return new HuaWei();
    }
}

//测试
$object = HuaWeiFactory::createPhone();

$object->call();

以上代码就是一个简单的工厂方法模式,工厂方法模式它是又将不同的产品线,又给你细化分开了,在思路上更清晰,在代码耦合度上更降低了。



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与