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


      话说,上次小陈自从把生产线从小作坊换成中大型工厂之后,业绩是一日千里,小陈更是财源滚滚,订单是一件接着一件,正直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     }

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

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

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

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

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

  • 相关阅读:
    可分离卷积详解及计算量 Basic Introduction to Separable Convolutions
    全面解读Group Normalization,对比BN,LN,IN
    高斯混合模型(GMM)及MATLAB代码
    VLAD算法浅析, BOF、FV比较
    MATLAB 可以画的各种类型的图总结
    检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3
    深度学习图像配准 Image Registration: From SIFT to Deep Learning
    在IIS7里配置 ISAPI,运行dll程序,总提示下载dll
    iis7下配置php出现404.17错误的解决办法
    C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-9240CE2738AE},HRESULT: 0x80004002
  • 原文地址:https://www.cnblogs.com/algorithm-cpp/p/5536427.html
Copyright © 2020-2023  润新知