Skip to content

Latest commit

 

History

History
158 lines (135 loc) · 2.89 KB

工厂模式.md

File metadata and controls

158 lines (135 loc) · 2.89 KB

工厂模式

工厂模式:
本来我们获取一个类的实例, 需要用new关键字, 但是如果在很多业务代码里面都实例化这个类, 如果类需要改名字, 那么就需要改很多地方
如果使用工厂模式, 不再使用new获取类的实例, 而是由工厂类提供类的实例, 降低了耦合性

工厂模式分为三种: 简单工厂模式、工厂模式、抽象工厂模式

简单工厂模式

<?php

class SimpleFactory
{
    public static function createMan()
    {
        return new Man();
    }

    public static function createWoman()
    {
        return new Man();
    }
}

class Man {}
class Woman {}

$man = SimpleFactory::createMan();
$woman = SimpleFactory::createWoman();

工厂模式

概念:
工厂模式和简单工厂模式类似, 唯一不同的是工厂模式允许多个工厂类存在, 相当于给工厂分组
规则:

  • 每个工厂类必须继承一个抽象类或实现一个接口
  • 每个产品类(工厂类生产产品类)必须继承一个抽象类或实现一个接口
  • 每个工厂类必须有一个工厂方法返回产品类的实例
<?php

/**
 * Interface Factory
 */
interface Factory
{
    public function create();
}

/**
 * Interface People
 */
interface People
{
    public function say();
}

/**
 * Class ManFactory
 */
class ManFactory implements Factory
{
    public function create()
    {
        return new Man();
    }
}

/**
 * Class WomanFactory
 */
class WomanFactory implements Factory
{
    public function create()
    {
        return new Woman();
    }
}

/**
 * Class Man
 */
class Man implements People
{
    public function say()
    {
        return 'man';
    }
}

/**
 * Class Woman
 */
class Woman implements People
{
    public function say()
    {
        return 'woman';
    }
}

$manFactory = new ManFactory();
$man = $manFactory->create();

$womanFactory = new WomanFactory();
$woman = $womanFactory->create();

抽象工厂模式

概念:
抽象工厂模式和工厂模式类似, 不同的是抽象工厂模式每个工厂类必须包含多个工厂方法
规则:

  • 每个工厂类必须继承一个抽象类或实现一个接口
  • 每个工厂类必须包含多个工厂方法
  • 每个工厂方法返回产品类的实例
<?php

interface AbstractFactory
{
    public function createAge();
    public function createName();
}

interface Age {}
interface Name {}

class ManAge implements Age {}
class WomanAge implements Age {}
class ManName implements Name {}
class WomanName implements Name {}

class ManFactory implements AbstractFactory
{
    public function createAge()
    {
        return new ManAge();
    }

    public function createName()
    {
        return new ManName();
    }
}

class WomanFactory implements AbstractFactory
{
    public function createAge()
    {
        return new WomanAge();
    }

    public function createName()
    {
        return new WomanName();
    }
}