1、简单工厂模式
简单工厂模式的定义:一个类可以根据不同的参数来获取不同的实例,一般这些被创建的实例都具有相同的父类。
静态工厂模式:一般的,我们将简单工厂模式中的用于创建不同实例的方法设置为静态方法,避免创建多个相同实例。
在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法
示例代码
1、定义interface,手机有打电话和拍照的功能
InterfaceMobile.php
<?php
interface InterfaceMobile
{
/**
* 打电话
* @return mixed
*/
public function call();
/**
* 拍照
* @return mixed
*/
public function photograph();
}
MobileIPhone.php
<?php
/**
* 苹果手机
* Class MobileIPhone
*/
require_once __DIR__ . '/InterfaceMobile.php';
class MobileIPhone implements InterfaceMobile
{
public function call()
{
// TODO: Implement call() method.
echo "IPhone: call" . "<br/>";
}
public function photograph()
{
// TODO: Implement photograph() method.
echo "IPhone: photograph" . "<br/>";
}
}
MobileHuawei.php
<?php
/**
* 华为手机
* Class MobileIPhone
*/
require_once __DIR__ . '/InterfaceMobile.php';
class MobileHuawei implements InterfaceMobile
{
public function call()
{
// TODO: Implement call() method.
echo "Huawei: call" . "<br/>";
}
public function photograph()
{
// TODO: Implement photograph() method.
echo "Huawei: photograph" . "<br/>";
}
}
MobileXiaomi.php
<?php
/**
* 小米手机
* Class MobileIPhone
*/
require_once __DIR__ . '/InterfaceMobile.php';
class MobileXiaomi implements InterfaceMobile
{
public function call()
{
// TODO: Implement call() method.
echo "Xiaomi: call" . "<br/>";
}
public function photograph()
{
// TODO: Implement photograph() method.
echo "Xiaomi: photograph" . "<br/>";
}
}
通过工厂类 Factory.php 去调用
<?php
/**
* 工厂类
* Class Factory
*/
class Factory
{
private static $instance;
public static function create($name)
{
$class = null;
switch ($name) {
case 'IPhone':
require_once __DIR__ . '/MobileIPhone.php';
self::$instance = new MobileIPhone();
break;
case 'Huawei':
require_once __DIR__ . '/MobileHuawei.php';
self::$instance = new MobileHuawei();
break;
case 'Xiaomi':
require_once __DIR__ . '/MobileXiaomi.php';
self::$instance = new MobileXiaomi();
break;
default:
echo "类 {$name} 不存在";
exit;
break;
}
return self::$instance;
}
}
实例化工厂类,生成不同的对象,不需要知道手机的实现细节
<?php
// 调用工厂
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once __DIR__ . '/Factoty.php';
$mobile_name = 'IPhone';
$instance = Factory::create($mobile_name);// 只需传入需要创建的手机类型即可,不需要知道细节: IPhone | Huawei | Xiaomi
$instance->call();
$instance->photograph();
缺点:
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,同样破坏了“开闭原则”;在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
2、工厂方法模式
定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。
代码示例:
沿用简单工厂模式中的
InterfaceMobile.php
MobileIPhone.php
MobileHuawei.php
MobileXiaomi.php
新增接口类:
InterfaceFactory.php
<?php
/**
* 工厂类
* Class Factory
*/
interface InterfaceFactory
{
public function create();
}
FactoryIPhone.php
<?php
require_once __DIR__ . '/InterfaceFactory.php';
class FactoryIPhone implements InterfaceFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryIPhone: create" . "<br/>";
require_once __DIR__ . '/MobileIPhone.php';
return new MobileIPhone();
}
}
FactoryHuawei.php
<?php
require_once __DIR__ . '/InterfaceFactory.php';
class FactoryHuawei implements InterfaceFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryHuawei: create" . "<br/>";
require_once __DIR__ . '/MobileHuawei.php';
return new MobileHuawei();
}
}
FactoryXiaomi.php
<?php
require_once __DIR__ . '/InterfaceFactory.php';
class FactoryXiaomi implements InterfaceFactory
{
public function create()
{
// TODO: Implement create() method.
echo "FactoryXiaomi: create" . "<br/>";
require_once __DIR__ . '/MobileXiaomi.php';
return new MobileXiaomi();
}
}
调用:
<?php
// 调用工厂
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once __DIR__ . '/FactoryIPhone.php';
require_once __DIR__ . '/FactoryHuawei.php';
require_once __DIR__ . '/FactoryXiaomi.php';
$mobile_name = 'IPhone';
if ($mobile_name == 'IPhone') {
// 苹果手机
$factory = new FactoryIPhone();
} elseif ($mobile_name == 'Huawei') {
// 华为手机
$factory = new FactoryHuawei();
} elseif ($mobile_name == 'Huawei') {
// 小米手机
$factory = new FactoryXiaomi();
}
$instance = $factory->create();
$instance->call();
$instance->photograph();