设计模式之工厂模式

2019-02-27  本文已影响0人  imjcw

前言

最近在复习一些基础,在里面就看到了工厂模式,由于之前未做过类似的整理,这里做一个整理。

概念

定义一个工厂类,我们告知工厂我们需要什么类,然后由工厂替我们实例化,我们不用管里面的实现逻辑,通过简单的调用就可以获得想要的东西。

分类

工厂模式里面细分多个设计模式:简单工厂、抽象工厂。当然里面有部分是重叠的。

简单工厂

通常只要传入一个参数,就可以获得相应的类。而这些类通常是继承于同一个父类。

示例:

<?php
/**
 * 定义一个动物类
 */
abstract class Animal
{
    protected $name = '';

    public function getName()
    {
        return $this->name;
    }
}

/**
 * 定义猫
 */
class Cat extends Animal
{
    protected $name = 'cat';
}

/**
 * 定义狗
 */
class Dog extends Animal
{
    protected $name = 'dog';
}

/**
 * 定义工厂类
 */
class Factory
{
    public function getAnimal($name)
    {
        return (new $name());
    }
}

// 开始执行
$factory = new Factory()
echo $factory->getAnimal('cat')->getName(); // cat
echo $factory->getAnimal('dog')->getName(); // dog

抽象工厂

这里细化了需要实例化的类,它将拥有同一种类的工厂单独封装,从而获得不同种类的实例。

示例:

<?php
/**
 * 定义一个动物类
 */
abstract class Animal
{
    protected $name = '';

    public function getName()
    {
        return $this->name;
    }
}

/**
 * 定义猫
 */
class Cat extends Animal
{
}

/**
 * 定义狗
 */
class Dog extends Animal
{
}

/**
 * 定义玩具猫
 */
class ToyCat extends Cat
{
    protected $name = 'toy cat';
}

/**
 * 定义玩具狗
 */
class ToyDog extends Animal
{
    protected $name = 'toy dog';
}

/**
 * 定义真猫
 */
class TurlyCat extends Cat
{
    protected $name = 'turly cat';
}

/**
 * 定义真狗
 */
class TurlyDog extends Animal
{
    protected $name = 'turly dog';
}

/**
 * 定义工厂类
 */
interface Factory
{
    public function getDog();
    public function getCat();
}

/**
* 定义玩具动物工厂
*/
class ToyAnimalFatory implements Factory
{
    public function getDog()
    {
        return (new ToyDog())
    }

    public function getCat()
    {
        return (new ToyCat())
    }
}

/**
* 定义真实动物工厂
*/
class TurlyAnimalFatory implements Factory
{
    public function getDog()
    {
        return (new TurlyDog())
    }

    public function getCat()
    {
        return (new TurlyCat())
    }
}

// 开始执行
$toyAnimalFatory = new ToyAnimalFatory()
echo $toyAnimalFatory->getDog()->getName(); // toy cat
echo $toyAnimalFatory->getCat()->getName(); // toy dog

$turlyAnimalFatory = new TurlyAnimalFatory()
echo $turlyAnimalFatory->getDog()->getName(); // turly cat
echo $turlyAnimalFatory->getCat()->getName(); // turly dog

最后

其实概念不是很难理解,主要看能否静下心来看这些程序。

工厂模式在一定程度上方便了简化了代码,但同时也给代码维护增加了难度,如果需要扩展,需要写的地方比较多。

上一篇下一篇

猜你喜欢

热点阅读