在标准的23种设计模式中,工厂相关模式有2种:工厂方法模式和抽象工厂模式。但是现在很多介绍设计模式的文章都会提到简单工厂模式(Simplefactorypattern),甚至还会提到静态工厂模式(Staticfactorypattern),那么多工厂相关的模式,它们之间到底是什么关系呢?先看图:简单来说,简单工厂就是静态工厂的升级,抽象工厂就是简单工厂的升级,不管是什么工厂,最终都是实现了工厂方法。这里要分清楚,工厂方法模式强调的是“方法”,而抽象工厂模式强调的是“工厂”。这是两个相关但不同的概念,就像“烹饪”和“厨房”一样。》的区别,一个是关于运动的,一个是关于空间的。工厂方法指的是工厂生产商品,不管是简单工厂还是抽象工厂,都是工厂本身的管理.没有工厂模式。比如你以前自己做饭自己吃:$food=newFood();静态工厂模式自己做饭自己吃还不错,但是因为要自己做饭洗衣服,东西多,容易乱,做饭还是外包比较好。我知道我们家旁边有个小饭店,就去饭店买菜。这是一种散coupling.为了简单起步,这里假设有几种固定的食物,不引入抽象商品的概念:classStaticFactory{publicstaticfunctionorderFood():Food{returnnewFood();}}到目前为止我们有了一个静态工厂,你可以按如下方式点餐:$food=StaticFactory::orderFood('鸡');直接下单,就这么简单。简单的工厂模式,但是如果你想开一家连锁店,比如麦当劳,你应该怎么办?这时候我们就需要用到简单工厂模式了:classSimpleFactory{publicfunctionorderFood():Food{returnnewFood();}}和上面的方法几乎没什么区别,唯一的区别就是少了一个static关键字,这样我们点餐的时候需要先新建一个工厂,然后再点餐。这是一个简单的工厂:$factory=newSimpleFactory();$food=$factory->orderFactory();我们现在不满足于抽象工厂模式,因为我们只吃麦当劳,还想吃肯德基。反正都是连锁店,提供的服务也差不多。这时候我们使用抽象工厂模型:$food->brand='麦当劳';返回$食物;}}classKFCextendsAbstractFactory{publicfunctionorderFood():Food{$food=newFood();$food->brand='肯德基';返回$食物;}}抽象工厂模型有一些限制。任何成为我工厂的人都必须提供基本的订餐服务。这样我们点餐的时候,点麦当劳就可以吃麦当劳的食物,点肯德基就可以吃肯德基的食物。$factory1=newMacDonald();$food=$factory1->orderFood();$factory2=newKFC();$food=$factory2->orderFood();简单的商品我们都知道麦当劳不仅仅卖一种食物,它可能卖鸡肉汉堡或者牛肉汉堡。既然要点餐,就必须说明点的是什么汉堡。我们不可能吃他们给我们的任何东西。你有很多方法可以做到,让我们从最愚蠢和最简单的开始,大部分代码沿用上面的代码,只是在这里稍微修改一下:classMacDonaldextendsAbstractFactory{publicfunctionorderChicken():Chicken{$food=newChicken();返回$食物;}publicfunctionorderBeef():Beef{$food=newBeef();返回$食物;}}调用方法:$factory=newMacDonald();$chicken=$factory->orderChicken();$beef=$factory->orderBeef();另一种写法,但这不是太愚蠢了吗?我们可以把它写成一个方法:}elseif($type=='beef'){$food=newBeef();}返回$食物;这样,我们在点餐时,只需要这样做:$factory=newMacDonald();$chicken=$factory->orderFood('chicken');$beef=$factory->orderFood('牛肉');当然,为了处理多种食物,你不应该写if...else,而是switch...case。AbstractGoods最后,为了满足依赖倒置原则,你实际上也应该抽象所有Goods:):食品;}classMacDonaldextendsAbstractFactory{publicfunctionorderFood($type):Food{if($type=='chicken'){$food=newChicken();elseif($type=='beef'){$food=newBeef();$food->brand='MacDonald',返回$food;}}classKFCextendsAbstractFactory{publicfunctionorderFood($type):Food{if($type=='chicken'){$food=newChicken();}elseif($type=='beef'){$food=newBeef();$food->brand='KFC',返回$food;}}$factory1=newMacDonald();$chicken1=$factory1->orderFood('chicken');$beef1=$factory1->orderFood('beef');$factory2=newKFC();$chicken2=$factory2->orderFood('鸡肉');$beef2=$factory2->orderFood('牛肉');还是一样的鸡肉,一样的牛肉,但是我们吃到了不同厂家的不同食物。这就是抽象工厂+抽象商品的作用,你最终达到完全解耦的目的。工厂方法模式说了半天,工厂方法模式到底好在哪里?事实上,工厂方法模式在每一个工厂中都已经完全消解了,哪怕是最简单的静态工厂,仅仅一句话,就已经说明了它是在使用工厂模式:returnnewFood();去做,交给工厂去做。这就是工厂方法模式。我在这里所说的只是一个介绍。希望初学者不要一上来就被那些高大上的术语吓傻了,不敢理会。其实设计模式并没有那么复杂,也没有什么高大上的地方。只要理解了它们的本质,任何人都可以轻松掌握,人人都可以成为架构师。当然,更深入的理解还需要大家认真学习,也欢迎大家提出不同的意见,共同学习,共同提高。在这里我推荐这个链接,您可以在其中更详细地了解其他模式。
