继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

12. 简单工厂模式

慕莱坞森
关注TA
已关注
手记 266
粉丝 35
获赞 146

定义

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

通俗理解

现实生活中的工厂,大家想到的是,在流水线上坐着的栩栩动人的工厂妹妹,在仓库门口搬货有着六块腹肌的工厂哥哥,还有... ...其实工厂重要的不仅仅是人,还有工厂生产的产品。我们有许多生活用品都是工厂生产的,我们的杯子,是通过塑胶厂压模生产出来的;我们的喝的牛奶,是通过牛奶厂厂自动化消毒、包装过的产品;我们看的书籍,是通过印刷厂印刷得到的。

现在有很多人,抱怨工厂的自动化生产,给他们带来了失业、下岗,使他们四肢不勤、五谷不分,很多人都向往着桃花源那样的农家生活,但是想象一下,如果没有了工业化,我们的生活会是怎么样的?

就举我们的看的书为例子,一本书,由作家构思到出版印刷,然后买到读者的手上,大概有这样的一个过程:构思、书写、校验、排版、印刷、装订、包装、销售。这八个过程还是一个简略的过程,实际上会复制得多。如果是工业化之后的社会,我们只需要去书店买这样的一本书就可以了,但是如果一手操劳的话。我们得先培养一批作家,让他们饱读诗书,让他们具备很好的想象力;然后要去伐木,将木头打成碎屑、漂白,做成白纸;去提取碳,做墨水... ... 然后我们要雕刻印刷版... ...这真的是一个繁重的过程,而且效率极其低下。

有什么办法?很简单嘛。各个专业的人做专业的事情,造纸厂造纸、墨水厂做墨水、印刷厂印刷(单一功能原则、依赖倒转原则)。普通的用户不需要关心这个过程,读者能够在书店买到这本书(迪米特法则)。

简单工厂就是这样,工厂生产一批差不多的产品(例如杯子厂生产方的,圆的杯子),我不需要知道其中的过程,我只需要告诉工厂,我需要什么产品,工厂就会按照我的需求,给我生产相对应的产品。

业务

渣渣程序

我们每个人都需要杯子用来喝水,那么我们拿杯子喝水的这个过程,可以由拿杯子、装水、喝水这三个过程组成,我们可以写出下面这样的程序。

杯子

public abstract class BaseCup {    public abstract String cupType();
}public class CircleCup extends BaseCup {    @Override
    public String cupType() {        return "这是一个圆杯子";
    }
}public class SquareCup extends BaseCup {    @Override
    public String cupType() {        return "这是一个方杯子";
    }
}

调用方

public class Human {    public static void main(String[] args) {
        BaseCup cup = new CircleCup();
        System.out.println(cup.cupType());
    }
}

上面的程序,是实现了功能,但是存在着一系列的问题,第一:调用方必须知道有什么继承了BaseCup,他能用什么杯子。第二:杯子的创建过程并没有建立起来,我们程序的例子只是使用了一个无参的构造函数,那如果我们使用了有参数的构造函数呢?我们是不是需要传入杯子的大小、颜色、形状,我们才能使用到杯子?其实对于用户来讲,他们只是需要一个杯子而已。

优化

既然我们进入工业化了,那么我们就用工厂来生产杯子,而不是我们自己来生产杯子。我们可以告诉工厂,我们需要什么类型的杯子,然后使用工厂生产的杯子就可以了。

类图

image

程序

工厂类

public class CupFactory {    public static BaseCup buildCup(String type) {        switch (type){            case "circle": return new CircleCup();            case "square": return new SquareCup();            default:return null;
        }
    }
}

调用方

public class Human {    public static void main(String[] args) {
        BaseCup cup2 = CupFactory.buildCup("square");
        System.out.println(cup2.cupType());
    }
}

优点

  1. 实现对象的创建和使用分离。使用工厂创建对象,调用方只需要使用就可以了。

  2. 创建对象时候提供一些默认初始化的参数。不需要调用方一个个去设置。

  3. 可以使用Spring的配置文件,或者其他配置文件,替代switch代码段,提高灵活性。

缺点

  1. 实例化的大旗由工厂扛,工厂倒闭了,大家都不能用。

  2. 一个类型就得建一个类,类多了,系统就复杂了。

  3. 增加新的类型要在工厂上加代码,工厂后面会变得好复杂。

  4. 工厂无法继承,没有子工厂的概念,全都是大包干。

应用场景

  1. 工厂生产的类型比较少的。

  2. 调用方不关心类是如何生产的。

https://www.jianshu.com/p/a62f211b2ef8



作者:Next_吴思成
链接:https://www.jianshu.com/p/a62f211b2ef8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP