从简单工厂说起。不管是面试还是被别人面试,问到设计模式,大部分人都会提到工厂模式。毫无疑问,与工厂相关的几种模式是设计模式中最著名、应用最广泛的模式。在GoF设计模式中,也是一种创建型模式。但是能把简单工厂、工厂模式和抽象工厂模式这三种模式解释清楚的人,真的能打动面试官。这里有一个前提,你真的可以解释清楚。大多数人,包括我在内,在我深入研究设计模式之前,都无法解释清楚。不管是我去面试,还是面试其他人。我在面试别人的时候,能说得过去差不多就够了。而我去面试的时候,也是类似的说说。在经历了很多挫折之后,萌生了深入研究设计模式的想法,于是产生了这个系列文章。从这个简单的工厂开始,让我们再次深入学习设计模式。当然这里用的是PHP。说明简单工厂,又称静态工厂,不属于GoF23设计模式。但是可以说,在所有的设计模式中,大家可能是最容易理解的,而且你可能已经在你的代码中使用过不知道多少次的设计模式了。让我们从最简单的代码段开始。//FactoryclassFactory{publicstaticfunctioncreateProduct(string$type):Product{$product=null;switch($type){case'A':$product=newProductA();休息;案例“B”:$product=newProductB();休息;}返回$产品;}}没错,核心点就是中间那段简单的switch代码,我们固定为返回值类型中Product接口的实现。这段代码中使用了PHP的新特性,参数类型和返回值类型product接口和product实现;}}classProductB实现Product{publicfunctionshow(){echo'ShowProductB';}}最后,客户端的使用很简单//Client$productA=Factory::createProduct('A');$productB=Factory::createProduct('B');$productA->show();$productB->show();从上面的代码可以看出,这其实是一个工厂类,根据我们传入的字符串或者其他你自己定义的标识符来返回对应的产品(Product对象)。打个比方:我是一个卖手机的批发商(client,businessside),需要一批手机(Product),所以找富士康(Factory)帮我生产。我下单($type变量)指定型号,然后富士康给了我对应的手机型号,然后我继续工作,和富士康的合作真的很愉快。这里比较规范的写法可能是所有的产品都会实现一个统一的接口,然后客户端只需要统一调用接口的方法即可。如果不规范,也可以不使用接口返回各种对象,类似于Facade模式统一门面管理。源码地址:简单工厂基础类图实现示例场景:短信发送功能模块。现在我们使用阿里云、蝶心、极光三个商家的短信服务。不同的业务可能会使用不同的SMS发送器。使用简单工厂可以很容易地满足这个需求。类图代码send('你有一条新的短信,请查看');源码地址:SimpleFactoryExample-SMSSendingFactory说明CreateMessage必须使用static?不一定,看你自己的业务情况,凡是需要常驻的static,按需实例化的在new之后就正常了->调用三个消息子类必须实现接口?不一定,php本身是弱类型语言,不能强制执行,但是接口的使用更符合面向对象的规范(请参考多态)。简单工厂本身其实就是多态的一种表现和应用。发送消息通道时,新增类继承Message接口,实现send()方法,修改MessageFactory()中createFactory()方法中的开关。想一想上面的修改违反了哪些面向对象的原则?(提示:打开XX)实例中没有使用返回值类型?这本身也是一种新语法。没有必要为了与旧版本兼容而编写。但是如果公司的技术栈已经升级到7以上,建议按照上面讲解的新特性来写这个设计模式架构类的代码,即带上参数类型和返回值类型,更符合规范,也更容易理解例子中传错$type返回NULL怎么办?亲,请在实际写代码的时候处理好这个问题。返回默认的一个或者上层捕获是一个很好的解决方案。当然,最好让客户提前判断。如果没有问题,去工厂。工厂方法模式,然后发送一条短信,不过这次我们让客户端换个姿势发送*
