设计模式总纲——抽象工厂模式
Posted AlgorithmC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式总纲——抽象工厂模式相关的知识,希望对你有一定的参考价值。
话说,上次小陈自从把生产线从小作坊换成中大型工厂之后,业绩是一日千里,小陈更是财源滚滚,订单是一件接着一件,正直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 }
这样的话我们就可以生产对一一对应的产品族了。
小陈看了一下,很开心,这样的话就可以节省很多自己的人力成本了。产品又都分成了一类,但是小陈转念一想,如果单单生产不同球队的产品就需要一个工厂的话,那样的话成本太大了,每次都要新建一个工厂,主管默默的点了点头,说道:
“当然了,如果更细分的话,其实骑士队的队徽和球鞋和雷霆的队徽和球鞋是属于同一个大类,这样的话,我们可以再在工厂内部加分支来进行选择,那样的话,只需要使用一个工厂的产品就可以了,这样的话,我们的生产线就不规范了,就会变成小作坊的工作模式了,但是有时候我们也会为了成本,不产生太多不必要的工厂来进行这种工作模式,所以说,看看究竟是为了扩展性来拓展产品好,还是为了减少成本(类的膨胀),不过有时候在我们开始建造工厂的时候都会先考虑生产的规模(工程规模)来择优,或者居中选择。”
小陈听了,陷入了沉思,看来企业要做大做强也不容易啊,考虑的东西要到方方面面啊,不过现在既然我每天的产品已经达到了 十万/天 的销量的话,那我先抓紧铺货了,就先拓展些工厂,增加产品,开始开搞了。小陈在自己的商业之路又迈出了坚实的一步,往后小陈又会在商业之路上遇到什么波折呢?
欲知后事如何,且听下文分解。
以上是关于设计模式总纲——抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章