设计模式:工厂模式
工厂模式其实是一种类,它具有创建对象的某些方法。我们可以使用工厂类来创建对象,而不是直接使用new。这样做的好处是,如果你想要更改实例化的类名,则只需要更改该工厂方法内容即可,不需要追一寻找代码中具体实例化的地方来修改。为系统结构提供灵活的动态扩展机制,减少耦合。
工厂模式可根据抽象程度不同可以分为:简单工厂模式、工厂方法模式和抽象工厂模式。
1、简单工厂模式
主要用来生产同一等级结构中的任意产品。不支持增加新的产品。它适用于创建对象较少的时候
2、工厂方法模式
主要用来生产同一等级结构中的固定产品,并且支持增加任意产品,它适用于生成数量多且功能复杂的产品。
3、抽象工厂模式
主要用来生成不同产品族的全部产品,同样不支持增加新产品但支持增加产品族。它适用于生成多个产品族而且易于扩展添加新的产品族。
一、简单工厂模式
提供一个创建对象实例的功能,而无需关心其具体的实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。
以下是一个实例:
interface UiInterface
{
public function getName();
}
class Bootstrap implements UiInterface
{
public function getName()
{
return 'bootstrap';
}
}
class Element implements UiInterface
{
public function getName()
{
return 'element';
}
}
class UiFactory
{
public static function createInstance($type)
{
$instance = null;
switch ($type) {
case 1:
$instance = new Bootstrap();
break;
case 2:
$instance = new Element();
break;
}
return $instance;
}
}
dump(UiFactory::createInstance(1)->getName());
dump(UiFactory::createInstance(2)->getName());
// 输出
string(9) "bootstrap"
string(7) "element"
二、工厂方法模式
工厂方法模式是在简单工厂模式的基础上进行了改进,它将创建对象的工作交给了各个子类,每个对象类型都有对应的工厂类。
这种模式的优点在于各个对象类型的创建于工厂类的创建分离,遵循了 单一职责原则,而且扩展性也很好。但是它也有缺点,在需要创建多个对象类型是,需要编写大量的工厂类。
interface UiInterface
{
public function getName();
}
class Bootstrap implements UiInterface
{
public function getName()
{
return 'bootstrap';
}
}
class Element implements UiInterface
{
public function getName()
{
return 'element';
}
}
abstract class AbstractUiFactory
{
abstract public function createInstance();
}
class BootstrapFactory extends AbstractUiFactory
{
public function createInstance()
{
return new Bootstrap();
}
}
class ElementFactory extends AbstractUiFactory
{
public function createInstance()
{
return new Element();
}
}
$bootstrapFactory = new BootstrapFactory();
dump($bootstrapFactory->createInstance()->getName());
$elementFactory = new ElementFactory();
dump($elementFactory->createInstance()->getName());
// 输出
string(9) "bootstrap"
string(7) "element"
三、抽象工厂模式
抽象工厂模式是在工厂方法模式的基础上进行改进,它对工厂和对象之间的关系进行了进一步的抽象和封装,可以创建更复杂的对象结构。抽象工厂模式的优点在于可以隔离具体类的生成,让用户关心对象的接口,而不需要关心对象的创建过程。但是他的缺点在于可扩展性不好,添加新的功能需要修改接口和所有实现类。
interface UiInterface
{
public function getName();
}
interface TechnicalInterface
{
public function getName();
}
class Bootstrap implements UiInterface
{
public function getName()
{
return 'bootstrap';
}
}
class Element implements UiInterface
{
public function getName()
{
return 'element';
}
}
class Vue implements TechnicalInterface
{
public function getName()
{
return 'vue';
}
}
class Reactive implements TechnicalInterface
{
public function getName()
{
return 'reactive';
}
}
abstract class AbstractUiFactory
{
abstract public function createUi();
abstract public function createTechnical();
}
class VBFactory extends AbstractUiFactory
{
public function createUi()
{
return new Bootstrap();
}
public function createTechnical()
{
return new Vue();
}
}
class VEFactory extends AbstractUiFactory
{
public function createUi()
{
return new Element();
}
public function createTechnical()
{
return new Vue();
}
}
class RBFactory extends AbstractUiFactory
{
public function createUi()
{
return new Bootstrap();
}
public function createTechnical()
{
return new Reactive();
}
}
class REFactory extends AbstractUiFactory
{
public function createUi()
{
return new Element();
}
public function createTechnical()
{
return new Reactive();
}
}
实例
功能:文件上传
需求:兼容市面上的云存储平台。能够快速切换平台进行文件上传。
interface FileManageInterface
{
// 上传文件
public function upload();
// 云存储上传所需token
public function token();
// 上传目录
public function uploadDir();
}
class Aliyun implements FileManageInterface
{
public function upload()
{
// TODO: Implement upload() method.
}
public function token()
{
// TODO: Implement token() method.
}
public function uploadDir()
{
// TODO: Implement uploadDir() method.
}
}
class Qiniu implements FileManageInterface
{
public function upload()
{
// TODO: Implement upload() method.
}
public function token()
{
// TODO: Implement token() method.
}
public function uploadDir()
{
// TODO: Implement uploadDir() method.
}
}
class FileManageFactory
{
public static function createInstance($type)
{
$instance = null;
switch ($type) {
case 1:
$instance = new Aliyun();
break;
case 2:
$instance = new Qiniu();
break;
}
return $instance;
}
}
FileManageFactory::createInstance(1)->upload();
发布时间 : 2023-02-28,阅读量:1208
本文链接:
https://upwqy.com/details/390.html