PHP 工厂模式

PHP 工厂模式PHP工厂模式

工厂模式简单示例

用工厂类中的方法实例化对象,当调用对象中的方法时,直接通过工厂类中的静态方法来调用对象中的方法。

如果想要更改实例化的类名,则只需要修改类名与工厂方法中 new 的类名即可。

<?php
    
/** * 接口 */
interface people
{ 
   
	public function say();    
}

/** * 类实现接口 */
class man implements people
{ 
   
    public function say()
    { 
   
        echo 'man';
    }
}

/** * 类实现接口 */
class woman implements people
{ 
   
    public function say()
    { 
   
        echo 'woman';
    }
}

/** * 简单工厂类 */
class echoFactory
{ 
   
    static function man()
    { 
   
        return new man();
    }
    
    static function woman()
    { 
   
        return new woman();
    }
}

# 调用
$man = echoFactory::man();
$man -> say();

工厂模式详解

工厂模式,就是负责生成其他对象的类或方法。

类实现

比如,我们有一些类,它们都继承自交通工具类:

在这里插入图片描述
在这里插入图片描述

简单示例1

<?php

class SimpleFactory
{ 
   
    public function createBicycle(): Bicycle
    { 
   
        return new Bicycle();
    }
}

class Bicycle
{ 
   
    public function driveTo(string $destination)
    { 
   
        echo 'Factory';
    }
}

$factory = new SimpleFactory();
$bicycle = $factory->createBicycle();
$bicycle->driveTo('Paris');

在这里插入图片描述

工厂模式

示例目录:factory 所有文件在此目录下。

AnimalInterface.php 动物接口

<?php
namespace factory;

# 动物接口
interface AnimalInterface{ 
   }

Chicken.php 实体鸡类继承–动物接口

<?php
namespace factory;
# 实体鸡
class Chicken implements AnimalInterface
{ 
   
  # 构造函数
  public function __construct()
  { 
   
    echo "生产了一只鸡~ \n";
  }
}

Factory.php 农场生产接口

<?php
namespace factory;

interface Factory { 
   
	# 生产
    public function produce();
}

Farm.php 生产动物类继承 Factory 农场接口

<?php
namespace factory;

# 农场:生产动物
class Farm implements Factory
{ 
   

  # 构造函数
  public function __construct()
  { 
   
    echo "初始化了一个农场~ \n";
  }

  # 生产方法-生产动物-动物类型
  public function produce($type='')
  { 
   
    switch ($type) { 
   
      case 'chicken':
        return new Chicken();
        break;
      case 'pig':
        return new Pig();
        break;
      default:
        echo "该农场不支持生产该农物~ \n";
        break;
    }
  }

}

Pig .php 实体猪类继承–动物接口

<?php
namespace factory;

# 实体猪
class Pig implements AnimalInterface
{ 
   
  # 构造函数
  public function __construct()
  { 
   
    echo "生产了一只猪~ \n";
  }
}

SampleFactory.php 动物工厂无须实现动物工厂接口–生产动物

<?php
namespace factory;

# 简单动物工厂--无须实现动物工厂接口--生产动物
class SampleFactory
{ 
   
	# 生产方法--生产动物--动物类型
    public static function produce($type='')
    { 
   
        switch ($type) { 
   
            case 'chicken':
                return new Chicken();
                break;

            case 'pig':
                return new Pig();
                break;

            default:
                echo "该农场不支持生产该农物~ \n";
                break;
        }
    }
}

Zoo.php 动物园–继承农场生产接口

<?php
namespace factory;

# 动物园:生产动物
class Zoo implements Factory
{ 
   
    # 构造函数
    public function __construct()
    { 
   
        echo "初始化了一个动物园~ \n";
    }
    
	# 生产方法:生产动物:动物类型
    public function produce($type='')
    { 
   
        switch ($type) { 
   
            case 'chicken':
                return new Chicken();
                break;

            case 'pig':
                return new Pig();
                break;

            default:
                echo "该农场不支持生产该农物~ \n";
                break;
        }
    }
}

运行 php test.php

  • 创建型模式
  • 工厂方法模式和抽象工厂模式的核心区别
  • 工厂方法模式利用继承,抽象工厂模式利用组合
  • 工厂方法模式产生一个对象,抽象工厂模式产生一组对象
  • 工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象
  • 工厂方法模式可以退化为简单工厂模式
// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{ 
   
    # print_r(dirname($_SERVER['SCRIPT_FILENAME']) . '/' . str_replace('\\', '/', $class));exit;
    # 浏览器打印 D:/Centos/PHPstudyWWW/easy-tips/patterns/factory/factory/Farm
    # cli 打印 ./factory/Farm
    # 注意:factory/factory 重复路径
    # print_r(dirname($_SERVER['SCRIPT_FILENAME']) . '/../' . str_replace('\\', '/', $class) . '.php');exit;
    # D:/Centos/PHPstudyWWW/easy-tips/patterns/factory/../factory/Farm.php
    require dirname($_SERVER['SCRIPT_FILENAME']) . '/../' . str_replace('\\', '/', $class) . '.php';
}

/************************************* test *************************************/

use factory\Farm;
use factory\Zoo;
use factory\SampleFactory;

初始化 Farm 工厂

// 初始化一个工厂
$farm = new Farm();

// 生产一只鸡
$farm->produce('chicken');
$ php test.php
初始化了一个农场~
生产了一只鸡~
// 生产一只猪
$farm->produce('pig');
$ php test.php
初始化了一个农场~
生产了一只猪~

初始化 Zoo 工厂

// 初始化一个动物园工厂
$zoo = new Zoo();
$zoo->produce("chicken");
$ php test.php
初始化了一个农场~
初始化了一个动物园~
生产了一只鸡~
$zoo->produce("pig");
$ php test.php
初始化了一个农场~
初始化了一个动物园~
生产了一只猪~
// 工厂方法模式退化为简单工厂模式
SampleFactory::produce("chicken");
SampleFactory::produce("pig");

打印全部

<?php
/** * 创建型模式 * 工厂方法模式和抽象工厂模式的核心区别 * 工厂方法模式利用继承,抽象工厂模式利用组合 * 工厂方法模式产生一个对象,抽象工厂模式产生一族对象 * 工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象 * 工厂方法模式可以退化为简单工厂模式(非23中GOF) * * php工厂模式 * @author TIGERB <https://github.com/TIGERB> * @author jealone <https://github.com/jealone> * @example 运行 php test.php */


// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{ 
   
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

/************************************* test *************************************/

use factory\Farm;
use factory\Zoo;
use factory\SampleFactory;

// 初始化一个工厂
$farm = new Farm();

// 生产一只鸡
$farm->produce('chicken');
// 生产一只猪
$farm->produce('pig');

// 初始化一个动物园工厂
$zoo = new Zoo();
$zoo->produce("chicken");
$zoo->produce("pig");

// 工厂方法模式退化为简单工厂模式
# SampleFactory::produce("chicken");
# SampleFactory::produce("pig");
$ php test.php
初始化了一个农场~
生产了一只鸡~
生产了一只猪~
初始化了一个动物园~
生产了一只鸡~
生产了一只猪~

PHP抽象工厂模式

根目录: factoryAbstract

Factory.php 工厂接口

<?php
namespace factoryAbstract;

interface Factory 
{ 
   
    public function createFarm();
    public function createZoo();
}

Income.php 收入接口

<?php
namespace factoryAbstract;

Interface Income { 
   
    public function money();
}

ZooInterface.php 动物园接口-继承-收入接口

<?php
namespace factoryAbstract;

# 动物园接口
interface ZooInterface extends Income
{ 
   
    public function show();
}

FarmInterface.php 农场接口-继承-收入接口

<?php
namespace factoryAbstract;

# 农场接口
interface FarmInterface extends Income
{ 
   
    public function harvest();
}

AnimalFactory.php 动物工厂类-继承-工厂接口

<?php
namespace factoryAbstract;

class AnimalFactory implements Factory
{ 
   
    public function createFarm()
    { 
   
        return new PigFarm();
    }

    public function createZoo()
    { 
   
        return new PandaZoo();
    }
}

PlantFactory.php 种植工厂类-继承-工厂接口

<?php
namespace factoryAbstract;

class PlantFactory implements Factory
{ 
   
    public function createFarm()
    { 
   
        return new RiceFarm();
    }

    public function createZoo()
    { 
   
        return new PeonyZoo();
    }
}

PandaZoo.php 熊猫园开馆类-继承-动物园接口

<?php
namespace factoryAbstract;

class PandaZoo implements ZooInterface { 
   

    public function show()
    { 
   
        echo "熊猫园开馆\n";
    }

    public function money()
    { 
   
        $this->show();
        echo "卖门票\n\n";
    }
}

PeonyZoo.php 牡丹园开馆类-继承–动物园接口

<?php
namespace factoryAbstract;
class PeonyZoo implements ZooInterface { 
   

    public function show()
    { 
   
        echo "牡丹园开馆\n";
    }

    public function money()
    { 
   
        $this->show();
        echo "卖门票\n\n";
    }

}

PigFarm.php 养猪场类-继承-农场接口

<?php
namespace factoryAbstract;

class PigFarm implements FarmInterface { 
   

    public function harvest()
    { 
   
        echo "养殖部门收获猪肉(不清真)\n";
    }

    public function money()
    { 
   
        $this->harvest();
        echo "卖猪肉\n\n";
    }
}

RiceFarm.php 稻田类-继承-农场接口

<?php
namespace factoryAbstract;

class RiceFarm implements FarmInterface
{ 
   
    public function harvest()
    { 
   
        echo "种植部门收获大米\n";
    }

    public function money()
    { 
   
        $this->harvest();
        echo "卖大米\n\n";
    }
}

预览打印

  • 创建型模式:php抽象工厂模式
  • 说说我理解的工厂模式和抽象工厂模式的区别:
  • 工厂就是一个独立公司,负责生产对象;
  • 抽象工厂就是集团,负责生产子公司(工厂);

test.php

// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{ 
   
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

use factoryAbstract\AnimalFactory;
use factoryAbstract\PlantFactory;

// 初始化一个动物生产线, 包含了一组产品
$animal = new AnimalFactory();

// 初始化一个植物生产线, 包含了一组产品
$plant = new PlantFactory();

// 模拟调用, 抽象工厂模式核心是面向接口编程
function call(factoryAbstract\Factory $factory) 
{ 
   
    $earn = function(factoryAbstract\Income $income) 
    { 
   
        $income->money();
    };
    $earn($factory->createFarm());
    $earn($factory->createZoo());
}

call($animal);

运行 php test.php

$ php test.php
养殖部门收获猪肉(不清真)
卖猪肉

熊猫园开馆
卖门票
call($plant);
$ php test.php
种植部门收获大米
卖大米

牡丹园开馆
卖门票
// 初始化一个动物生产线, 包含了一组产品
$animal = new AnimalFactory();

// 模拟调用, 抽象工厂模式核心是面向接口编程
function call(factoryAbstract\Factory $factory) { 
   
    var_dump($factory);exit; # object(factoryAbstract\AnimalFactory)#1 (0) {}
    $earn = function(factoryAbstract\Income $income) { 
   
    	var_dump($income);exit; # object(factoryAbstract\PigFarm)#4 (0) {} 
    	$income->money();
    };
    $earn($factory->createFarm());
    $earn($factory->createZoo());
}

call($animal);
$ php test.php
object(factoryAbstract\AnimalFactory)#1 (0) {}

今天的文章PHP 工厂模式分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23721.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注