文档章节

JAVA设计模式之工厂模式(创建型)

my_juke
 my_juke
发布于 03/07 20:19
字数 1420
阅读 1
收藏 0

先来个美女镇楼:

简单工厂

一般理解为调用静态方法产生你所需要的对象,其实可以进一步扩展,任何方法都是一个简单工厂,不管有参无参都是调用方法,然后得到你所需要的对象,比如如下方法:

 public String getOrderNo(String appCode){
        return EnumSeqCode.BSCHECK.getCode()+appCode+getSeqNumber(EnumSystemId.VS_BIZ_BSCHECK.getCode(), EnumSeqCode.BSCHECK.getCode());

    }

    public String getSeqNumber(String sysId,String seqCode){
        //年份月份+唯一数字
        String yy = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
        int seq = sequenceHelper.getNextSequence(sysId,
                seqCode);
        return yy+seq;
    }

我说上面两个是工厂模式各位应该没有意见吧。印象比较深刻的工厂模式就是Spring获取Bean的方法了。 咱们现在就来一个获取Bean的工厂:

public static Fruit getFruit(String fruit){
        if (stringutils.equals(fruit,"banana")){
            return new banana();
        } else if(stringutils.equals(fruit,"apple")) {
            return new apple();
        } else if(stringutils.equals(fruit,"pear"))  {
            return new pear();
        } else if(stringutils.equals(fruit,"grape")) {
            return new grape();
        } else {
            return null;
        }
    }

就算是不懂设计模试的人,当要获取到的水果比较多的时侯,自然而然就会想着优化代码,将代码提取到一个方法中,只是可能不会单独创建一个叫FruitFactory的类,所以说设计模式没什么,当你写的代码多了,经历的场景多了,你就会自然而然这样去写。上面的代码有一个问题,当水果再次增多的时候,你会发现这样写很麻烦,代码也不好看,说不定什么时候手一抖,删掉了一行,也不一定,因为编译时是发现不了错误的。这个时侯个人认为有两种方式:
第一种通过配置文件的形式进行解决,如下: banana=com.pkg.Banana,怎么样是不是很熟悉,对这就是IOC。
第二种,在Factory中添加一个Map,系统启动的时候,把水果对象一个一个put进去。 这就是简单工厂,很简单的吧,想起以前老师讲的一句话,万事万物皆对象,现在是万事万物皆工厂。但是我们一般把需要创建多个自定义对象并且这些自定义对象有一个共同的自定义类作为父类的方法当作简单工厂,命名以Factory结尾。


工厂方法 抽象工厂

根据上面的水果工厂,想象一种情况,假如我现在我需要的不仅是水果,还需要水果树。可以这样做,创建一个FruitTreeFactory的类,里面生产水果树,根据不同的参数,产生不同的水果树。这个时候我们有2个工厂,FruitFactory,FruitTreeFacory,2个产品,Fruit,FruitTree。我们估且当这部代码由开发人员A提共,开发人员B负责调用。于是有这样一个功能,用户告诉我一个水果的名称,然后我告诉他需要一个水果树,然后产生水果。

    public static void main(String[] args){
        FruitTreeFactory f1 = new FruitTreeFacory();
        FruitFacory f2 = new FruitFactory();
        FruitTree p1 = f1.getProduct("banana");
        Fruit p2 = f2.getProduct("banana");
    }

兄弟们,这段代码好丑,如果将来还需要水果油了,是不是很复杂,很混乱。代码复杂与丑陋肯定相到要重构,才能有优化代码的灵感,所谓量变引起质变吗,我们发现不管获取香蕉树,香蕉,香蕉油,香蕉XXXX等,都要传参banana,既然多处要传参banana我们可以将它变成只有一个入口,成为一个入口后,香蕉,香蕉树,香蕉油,香蕉XXX等只能合在一个对象返回了。我们叫这个新的对象为香蕉工厂,它负责产生香蕉,香蕉树,香蕉油。类似的可以创建葡萄工厂等等。改造后的代码是:

public static void main(String[] args){
        FruitFactory f1 = new BananaFactory();
        Fruit p1 = f1.getFruit();
        FruitTree p2 = f1.getFruitTree();
    }

然后再加上一个简单工厂获取香蕉工厂,葡萄工厂就可以了。
上面的重构后的代码就是抽象工厂了,所以抽象工厂可以理解为:简单工厂返回的是产品,而抽象工厂返回的是工厂,这个工厂不是简单工厂,而是一个产品族,它里面产生的是同族的固定产品。
那么什么是工厂方法:抽象工厂里面返回的工厂只生产一个固定的产品,我们称之为工厂方法,很别扭对不对,所以说只有简单工厂与抽象工厂,没有什么工厂方法
总结:
简单工厂就是根据一个参数创建多个产品。 抽象工厂就是根据一个参数创建一个工厂,该工厂生产2个以上的固定产品族。 如果应用内有根据同一个参数创建2个不同产品的时候,就可以考虑使用抽象工厂了。
设计模式就是大量代码的基础上进行代码优化的结果。在我们的代码中没必要刻意去使用设计模式。当然有设计模式经验的人,再写代码的时候就会往这方面进行预留,方便后续进行扩展,同时在阅读别人的代码的时候,也能有的放矢。
这里我理解的工厂模式,有不足之处,还请见谅。

© 著作权归作者所有

my_juke
粉丝 4
博文 34
码字总数 22261
作品 0
深圳
私信 提问
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
277
2
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
245
0
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
2018/09/10
0
0
Java程序员从笨鸟到菜鸟之(三十三)大话设计模式(三)单例模式

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说...

长平狐
2012/11/12
152
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部