设计模式总纲——抽象工厂模式

  话说,上次小陈自从把生产线从小作坊换成中大型工厂之后,业绩是一日千里,小陈更是财源滚滚,订单是一件接着一件,正直NBA火热,特别是NBA系列的产品卖得相当火热,这时有件事情让小陈犯难了,因为在这边,小陈目前的生产线只是进行单一的进行生产,队徽工厂生产着队徽,球衣工厂生产的球衣,球鞋工厂生产着球鞋,而小陈在业绩提高的同时,他对业绩进行了大数据分析,他发现了,购买了骑士队队徽的人有99.99999%的人会购买骑士队服,和印有骑士队标的球鞋,同理购买了雷霆队徽的人也会购买雷霆队的队服和雷霆队的篮球。

  这让小陈头疼的是,因为工厂生产的产品单一并且分散,每次进行发货的时候,都要等待他们从不同的地方运到店里,然后由店员进行组装,这样,不仅耗时,而且小陈的人力成本也蹭蹭蹭的往上涨,这不,小陈的员工又开始向小陈抱怨了,“陈总,你看我们每天都要组装将近1万套的产品,员工已经都累得要死要活了,很多人都打算辞职不干了,你赶紧给想想办法吧。”,小陈这时候急的焦头烂额,赶忙给一线人员升值加薪,才暂时安抚住了他们的情绪。

  这时候,小陈也联系了工厂的主管,向他述说了目前的苦衷,询问有没有更好的办法。这时他们的主管向小陈说:“你这种问题以前我们早就遇到了,我们肯定已经早已做好了预案了,像我们公司总部那边对于一系列的套装产品的话,比如像,一个产品族的产品都迁移到同一个工厂生产,并进行组装,类似球鞋,球衣,篮球就属于一类产品,不同的产品族对应着不同的工厂,来,我来给你看一下,我们工厂中,对于产品族工厂的架构图。”然后工厂的主管就给小陈传了一张产品族生产工厂的架构图。

“你看,如果要生产一系列的产品族产品的话,只需要把产品生产线放在一起就可以了。”,现在我们来看看具体的产品线的模板代码:比如我们这次要来生产一套骑士队的产品和雷霆队的产品,产品暂时就包含了队徽和球鞋

1、一个抽象接口,专门用来生产队徽和球鞋的,但是具体的实现交给下面的子工厂。

1 public interface AbstractFactory {
2     public AbstractProduct createBadge();
3     
4     public AbstractProduct createShoes();
5 }

2、产品生产的图纸,这里只包含的具体产品的信息,如果需要有特定的方法,则自行进行添加。

1 public interface AbstractProduct {
2     public void productInfo();
3 }

3、克利夫兰和雷霆的产品工厂,专门生产克利夫兰骑士队的队徽和球鞋和雷霆队的队徽和球鞋

 1 public class CavalierProductFactory implements AbstractFactory{
 2     @Override
 3     public AbstractProduct createBadge() {
 4         return new CavalierBadge();
 5     }
 6 
 7     @Override
 8     public AbstractProduct createShoes() {
 9         return new CavalierShones();
10     }
11 }
 1 public class ThunderProductFactory implements AbstractFactory{
 2 
 3     @Override
 4     public AbstractProduct createBadge() {
 5         return new ThunderBadge();
 6     }
 7 
 8     @Override
 9     public AbstractProduct createShoes() {
10         return new ThunderShoes();
11     }
12 }

而上面的队徽和球鞋则实现自AbstractProduct接口,取其中一例即可。

1 public class CavalierBadge implements AbstractProduct{
2     @Override
3     public void productInfo() {
4         System.out.println("This is a Cavalier Badge!");
5     }
6 }

现在两个工厂就可以开始各司其职的实现他们对应的产品了,像上篇文章所述,我们可以把对应的工厂写到具体的配置文件中,然后根据反射来进行实现具体的工厂。

 1     @Test
 2     public void client() {
 3         CavalierProductFactory cavalierFactory = (CavalierProductFactory)XMLUtils.getFactory("CavalierProductFactory");
 4         ThunderProductFactory thunderFactory = (ThunderProductFactory)XMLUtils.getFactory("ThunderProductFactory");
 5         
 6         AbstractProduct cavalierBadge = cavalierFactory.createBadge();
 7         AbstractProduct cavalierShoes = cavalierFactory.createShoes();
 8         
 9         AbstractProduct thunderBadge = thunderFactory.createBadge();
10         AbstractProduct thunderShoes = thunderFactory.createShoes();
11     }

这样的话我们就可以生产对一一对应的产品族了。

小陈看了一下,很开心,这样的话就可以节省很多自己的人力成本了。产品又都分成了一类,但是小陈转念一想,如果单单生产不同球队的产品就需要一个工厂的话,那样的话成本太大了,每次都要新建一个工厂,主管默默的点了点头,说道:

“当然了,如果更细分的话,其实骑士队的队徽和球鞋和雷霆的队徽和球鞋是属于同一个大类,这样的话,我们可以再在工厂内部加分支来进行选择,那样的话,只需要使用一个工厂的产品就可以了,这样的话,我们的生产线就不规范了,就会变成小作坊的工作模式了,但是有时候我们也会为了成本,不产生太多不必要的工厂来进行这种工作模式,所以说,看看究竟是为了扩展性来拓展产品好,还是为了减少成本(类的膨胀),不过有时候在我们开始建造工厂的时候都会先考虑生产的规模(工程规模)来择优,或者居中选择。”

小陈听了,陷入了沉思,看来企业要做大做强也不容易啊,考虑的东西要到方方面面啊,不过现在既然我每天的产品已经达到了 十万/天 的销量的话,那我先抓紧铺货了,就先拓展些工厂,增加产品,开始开搞了。小陈在自己的商业之路又迈出了坚实的一步,往后小陈又会在商业之路上遇到什么波折呢?

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

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