美文网首页
设计模式之工厂模式

设计模式之工厂模式

作者: imjcw | 来源:发表于2019-02-27 14:48 被阅读0次

    前言

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

    概念

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

    分类

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

    简单工厂

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

    示例:

    <?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
    

    最后

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

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

    相关文章

      网友评论

          本文标题:设计模式之工厂模式

          本文链接:https://www.haomeiwen.com/subject/auffuqtx.html