先从简单工厂入门,不论是面试仍是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式。毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较普遍的一种模式。在GoF设计模式中也都是属于建立型的模式。php
可是,可以说明白简单工厂、工厂模式、抽象工厂模式这三种模式的人还真能让面试官另眼相看。这里有个前提,是你真的能说明白,大部分人,包括在深刻研究设计模式以前,我也没办法说清楚。不论是我去面试,仍是面试其别人。当我面试别人的时候,能讲个大概也就差很少了。而我去面试的时候,也就是相似的讲个大概。经历很多挫折以后才有了想深刻的研究研究设计模式的想法,因而便会产生这一系列的文章。从这篇简单工厂开始,咱们一块儿再次深刻的对设计模式进行学习。git
简单工厂,也称静态工厂,不属于GoF23种设计模式。可是能够说是全部的设计模式中你们可能最容易理解,也可能在你的代码中早就已经用过不知道多少次的一种设计模式了。咱们先从一个最最简单的代码段来看。github
// Factory
class Factory {
public static function createProduct(string $type) : Product {
$product = null;
switch ($type) {
case 'A':
$product = new ProductA();
break;
case 'B':
$product = new ProductB();
break;
}
return $product;
}
}
复制代码
没错,核心点就是中间那段简单的switch代码,咱们在返回值类型中固定为Product接口的实现。面试
在这段代码中,使用了PHP新特性,参数类型及返回值类型设计模式
产品接口和产品实现架构
// Products
interface Product {
public function show();
}
class ProductA implements Product {
public function show() {
echo 'Show ProductA';
}
}
class ProductB implements Product {
public function show() {
echo 'Show ProductB';
}
}
复制代码
最后客户端的使用就很简单了学习
// Client
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();
复制代码
从以上代码能够看出,其实这里就是一个工厂类根据咱们传入的字符串或者其余你本身定义的标识符,来返回对应的产品(Product对象)。阿里云
形象化一点的比喻:我是一个卖手机的批发商(客户Client,业务方),我须要一批手机(产品Product),因而我去让富士康(工厂Factory)来帮我生产。我下了订单($type变量)指明型号,而后富士康就给我对应型号的手机,而后我就继续个人工做了,和富士康的合做还真是挺愉快的。spa
这里比较规范的写法多是全部产品都会去实现一个统一的接口,而后客户端只知道接口的方法统一调用便可。不规范的话也能够不使用接口,返回各类不一样的对象,相似于外观(Facade)模式进行统一的门面管理。设计
源码地址:简单工厂基础类图实现
场景:短信发送功能模块。如今咱们使用了三个商家的,分别是阿里云、蝶信、极光的短信服务,在不一样业务中可能使用不一样的短信发送商,使用简单工厂能够方便的完成这个需求。
类图
代码
<?php
interface Message {
public function send(string $msg);
}
class AliYunMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg;
}
}
class BaiduYunMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '百度SMS短信发送成功!短信内容:' . $msg;
}
}
class JiguangMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '极光短信发送成功!短信内容:' . $msg;
}
}
Class MessageFactory {
public static function createFactory($type){
switch($type){
case 'Ali':
return new AliYunMessage();
case 'BD':
return new BaiduYunMessage();
case 'JG':
return new JiguangMessage();
default:
return null;
}
}
}
// 当前业务须要使用极光
$message = MessageFactory::createMessage('Ali');
echo $message->send('您有新的短消息,请查收');
复制代码
源码地址:简单工厂实例-短信发送工厂
说明
工厂方法模式,接着发短信,但这回咱们让客户端换个姿式来发