设计模式之工厂模式
时间:2021-09-05
本文章向大家介绍设计模式之工厂模式,主要包括设计模式之工厂模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之工厂模式
为什么要工厂模式
- 有些类很常用,我们会在很多地方进行实例化。假如有一天这个类名突然有天要修改,是不是惆怅?
- 我想根据参数条件来调用对应的对象。有点像
switch
干的活。这样就简化了逻辑,统一控制,代码也比较简化。
一、简单工厂
namespace DesignPatterns\SimpleFactory;
/**
* 短信发送组件
* @author jack
*/
abstract class Message {
abstract public function send($mobile,$message);
}
Class Alidayu extends Message
{
public function send($mobile,$message){}
}
Class SMS56 extends Message
{
public function send($mobile,$message){}
}
简单工厂封装
namespace DesignPatterns\SimpleFactory;
/**
* @author Jack
*/
class MessageFactory
{
protected $msgType = [
'alidayu' => 'Alidayu',
'56' => 'SMS56'
];
/**
* 生成对象
* @param string $name
* @throws \Exception
* @return Object
*/
public function createMessage( $name )
{
if (! array_key_exists($name, $this->msgType)) {
throw new \Exception("$name not exist");
}
return new $this->msgType[$name];
}
}
客户端使用
$mf = new MessageFactory();
$message = $mf->createMessage('56');
var_dump($message);
如果你想增加一个新的短信组件,比如它叫 onesmser
,我们只需要先继承我们的 Message 类,然后在工厂类中加上,只需要在我们的 msgType
中添加就可以了
二、静态工厂方法模式
静态工厂和之前的简单工厂有些类似,两者的区别在于 静态工厂中有一个静态方法用来实例化它所能实例化的所有对象
产品类:
namespace DesignPatterns\SimpleFactory;
/**
* 抽象产品,定义具体产品继承的父类或者实现的接口
* @author jack
*/
abstract class Message {
abstract public function send($mobile,$message);
}
/**
* 具体产品
*/
Class Alidayu extends Message
{
public function send($mobile,$message){}
}
Class SMS56 extends Message
{
public function send($mobile,$message){}
}
工厂类
namespace DesignPatterns\SimpleFactory;
/**
* 工厂类
*/
class Factory
{
static function createMessage($type)
{
switch ($type) {
case 'alidayu':
return new Alidayu();
break;
case '56':
return new SMS56();
break;
}
}
}
客户端代码:
namespace DesignPatterns\SimpleFactory;
class Test {
private $msg;
function getMessage($type)
{
$this->msg = Factory::createMessage($type);
}
}
原文地址:https://www.cnblogs.com/chengwens/p/9727ca470c6fda0f228e1690332f32aa.html
- FFmpeg菜鸡互啄#第3篇#视频解码
- FFmpeg菜鸡互啄#第4篇#音频解码
- FFmpeg菜鸡互啄#第5篇#视频帧格式转换
- tomcat请求处理分析(三) 绑定本地端口监听请求
- 利用FFmpeg对火眼一体摄像机的回调数据进行处理:YUV转H264,H264封装flv,所有输入都是在内存中。
- MySQL 传统复制中常见故障处理和结构优化案例分析
- sql带条件查找最小缺失编号
- activiti学习笔记(六) 监听器
- activiti学习笔记(五) 流程部署
- 打开文件open()函数的使用方法详解
- activiti学习笔记(四) 配置器
- WaitForMultipleObjects用法详解,一看就懂
- activiti学习笔记(三) 监听生命周期
- Assignment 2 | 斯坦福CS231n-深度学习与计算机视觉课程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法