12. 简单工厂模式

定义

简单工厂模式(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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352