设计模式总纲——工厂方法模式

  接上文,自小陈,联系了小作坊工厂之后,生产出了几千件产品之后,把他的那三件产品摆上了网店,并且在微信中宣传之后,获得了一致好评,购买者络绎不绝,特别是骑士队队徽,正值NBA东西部决赛,卖的特别火热,一下子就脱销了,这时候小陈想扩大产品线,又生产了一大批的图纸,包括了一系列NBA中的其他球队的徽章和一些其他的小玩意,打算联系这个小作坊工厂,想让其也一起生产这些产品,但是这个小工厂表示无可奈何,因为这个工厂实在是太小了,如果要扩充产品线的话,必须把原来的机器给拆了,重新组装里面的图纸,而且因为图纸太多,会导致机器内部臃肿不堪,不堪重负,所以这个小作坊也表示无可奈何。

  恰巧这时候雷霆队和勇士队酣战正甘,不少客户都希望得到雷霆队的队徽和勇士队的队徽,而且有的还希望小陈可以扩充产品系列,生产骑士,雷霆,勇士队的队服,这时候小陈是急的像热锅上的蚂蚁一样,因为客户的要求的产品越来越多样,这个小作坊已经满足不了了,这时候厂里面的主管就献策了,说认识几家中大型工厂,可以解决生产上的问题,小陈一听,乐不可支的就赶紧让小作坊的主管联系了中大型工厂的主管,然后便驾车前往工厂查看了。

  到了工厂一看,果然不小,开车绕着工厂一圈竟然花了10几分钟,联系了这家工厂的主管之后,小陈了解到了一些具体的消息,这家公司有下属的多家子公司,而且每个子公司都分工明确,对于产品,各个子公司做的产品都是单一的,既保证了生产的速率,也保证了生产的质量,不会因为生产过多类型的产品导致混乱,职责单一,说着说着,这个主管给小陈画了一下他们的公司架构图....如下:

  

如图所示,总部下面分别有多个子工厂,不同的子工厂生产不同的产品,如工厂A和工厂B,正如设计图纸Product一样,需要有具体的产品A和B,而大型工厂就是不一样,规范,产品A由工厂A来生产,产品B由工厂B来生产,不再想小作坊工厂一样,所有的产品都耦合在一个工厂里面了,我们来看看具体的模板代码:

产品接口,像图纸一样,所有的产品都必须有图纸,既所有的产品都必须实现该接口,像以下的具体产品A,和具体产品B

1 public interface Product {
2     public void productMethod();
3 }
1 public class ConcreteProductA implements Product{
2     @Override
3     public void productMethod() {
4         System.out.println("Create Product A!");
5     }
6 }
1 public class ConcreteProductB implements Product{
2     @Override
3     public void productMethod() {
4         System.out.println("Create Product B!");
5     }
6 }

工厂接口,既总部,所有的分公司,都是由下面总部衍生出来的,具体要生产什么样的产品子公司可以自行决定,但子公司必须听从总部的指挥,不能脱离总部

1 public interface Factory {
2     public Product createProduct();
3 }

具体生产A产品的工厂和生产B产品的工厂

1 public class ConcreteProductFactoryA implements Factory{
2     @Override
3     public Product createProduct() {
4         return new ConcreteProductA();
5     }
6 }
1 public class ConcreteProductFactoryB implements Factory{
2     @Override
3     public Product createProduct() {
4         return new ConcreteProductB();
5     }
6 }

他们生产的过程如下:

1     @Test
2     public void client(){
3         Factory factory = new ConcreteProductFactoryA();
4         Product product = factory.createProduct();
5         product.productMethod();
6     }

看到这个生产过程,小陈就疑惑了,这样的话,每次生产的时候都要生产一个工厂喽?那样很不划算啊,这个主管默默的点了点头说,不错不错,小陈真是有生意头脑,当然了,我们总部是不会这样子做的,这样成本太高了,而且我们实在也负担不起,每当我们总部要建立下属工厂的时候,都会把这个工厂的具体地址登记在案,(将工厂名的信息记录到配置文件中),等到需要的时候,我们直接从记录册里面定位出所需的工厂就是了。(等到需要使用的时候,直接通过反射,让虚拟机读取配置文件,自行"找到"该工厂),我们的登记范本是这样的:

1 <?xml version="1.0"?>  
2 <config>  
3     <className>ConcreteProductFactoryC</className>  
4 </config>

所以,当我们需要扩建子工厂的时候,只需要得到总部的同意(实现Factory方法),然后把子工厂的信息登记在案,(把子工厂名记录到配置文件中),等到需要的时候,我们就可以用工厂开始建造所需的东西了,当然了,还需要有图纸哦。(实现了Product方法的产品)。

小陈惊呼,妙哉,通过一个记录本就可以省去了那么多的成本,也便于管理了,接下来,小陈就把目前的新需求告诉了新主管,然后主管听了之后,联系了几家子公司,边开始生产新的所需的产品了,一下子就生产出了骑士、雷霆、勇士的徽章、队服,队旗等产品,小陈另一方面也联系了网店的店长,让他开始铺货,上架出售,一切都井井有条,看来小陈离当上CEO,迎娶白富美,走上人生巅峰的路更近了。。但是后面有个头大的事情又出现了。

  欲知下文如何,且听下文分解。

原文地址:https://www.cnblogs.com/algorithm-cpp/p/5528759.html