设计模式之工厂模式
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
最后
其实概念不是很难理解,主要看能否静下心来看这些程序。
工厂模式在一定程度上方便了简化了代码,但同时也给代码维护增加了难度,如果需要扩展,需要写的地方比较多。