抽象工厂模式,23种设计模式之一,可能大部分同学们在实际开发过程中很少会使用到改模式,绝大部分原因还是该模式的抽象层度又上了一个台阶,在理解层度有难度,本人也在网上看过一些博主关于抽象工厂模式的手记和文章,大部分都是千篇一律,师出同门,同一篇帖子被转了千百遍,而接下来我和同学们一起来学习该模式,并和同学们分享在实际项目中改模式运用的例子,咱们上的就是干货!(ps:本文章将采用c#进行代码实操,Java和其他语言的同学也不用多想,毕竟语言只是一种载体,万变不离其宗吗!)
抽象工厂模式——为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。具体点举个栗子:比如你去吃海底捞,服务员只会提供一份菜单给你,你只管按照菜单上的菜名点菜就可以了,至于制作的过程你无需关系,映射过来菜单上的菜名就是咱们工厂提供的接口,菜的制作工程你则无需知道。
博主在书上看到过一段改模式的适用场景的解读,但是说的也比较拗口难理解,于是我通过自己平时的实际开发经验对其适用场景做了另一番比较容易理解的解读
1、客户端不依赖于产品类实例如何被创建、实现等细节(ps:举个栗子,我们在程序开发过程中,在写Controller方法的时候,我们只需要知道工厂这个接口,结构提供了那些方法就可以了,你无需去知道工厂里面做了哪些具体内容,这样做从而也很好的解降低了程序代码之间的耦合层度,毕竟咱们所追求的就是低耦合吗,就比如你在海底捞准备吃火锅的时候,服务员会递给你一个菜单,这个菜单就相当于我们的工厂,而菜单上的菜名就是工厂提供的方法)
2、强调一系列相关的产品对象一起使用创建对象需要大量重复的代码(ps:举个栗子,咱们有时候在写代码的时候会写很长很长的一段,但是写完后会发现有很多代码都是重复的,这样就显得代码很冗余,最大的影响还是会影响我们程序的性能,而这时我们第一想到的就是对这些重复出现的代码进行一个封装,所以抽象工厂模式也对这些东西进行了封装,这也是对面向对象三大特性的一种体现)。
3、提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。(ps:举个栗子,上一点咱们说到有时候咱们有时候写的代码又长又不好看,你把所有的逻辑都写成一段,这种面条式开发可不是咱们所追求的,编程是门艺术,我们需要将自己的代码写比较优美而又精简,这时我们会对不同的业务逻辑进行不同的封装,就比如你点的每个菜,他都有自己单独的制作过程,而这些制作过程又都基本上包含蒸煮炒炸)
1、咱们在项目开发中肯定是避免不了对用户和部门等对象进行操作的,接下来我们会议这两大对象进行该模式的代码编写和解读
咱们的业务是这样的,现在我们已有一套完成的系统,但是由于公司需要,数据库需要进行改版和升级,需要由原来的SQL server改成MySQL,这个时候问题就来了,SQL server和MySQL在一些语法上是有差异的,在SQL server上能运行但是挪到MySQL上来就报错误了,举个栗子,存储过程在SQL server中我们调用存储过程一般都是Exce 存储过程名字+参数,而MySQL则是用call+存储过程名字(参数名称),这个时候我们就需要对程序的数据库访问层需要进行大量的改动,如果使用抽象工厂模式则就能还好的避免这个问题
首先咱们会先创建User和Department这个两个类,这两个类都包含id和name这两个属性
接下来咱们会对这两个对象进行接口的一个编写,他们都包含新增和获取数据这两个接口
接下来我们需要对接口进行不同数据的具体实现
这个时候我们已经把各个模块需要做的具体功能给实现了,但是他们现在还是属于三无产品,没有出厂证明,不是有工厂进行统一生产的,这个时候我们我们就需要对User和Department往上进行一层抽象,也就是往上建已成工厂,用来生产他们,给他们贴上出厂证明合格证
好,现在这第一层已经建好了,但是呢,它还只属于分厂,分厂上面还有一个总厂,总厂就是来对这些分厂进行制定规则统一管理的,让他们生产什么就什么
好的,现在工厂咱们已经建好了,就查直接生产了,现在咱们可以到客户端对其进行调用了,也就是说你每次去海底捞,从进店,坐下来到最后服务员把菜单递给你,所有准备工作都做好了,你就可以开始点菜了
这就是得到的结果
(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建
(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度
以上呢就是博主给大家从下往上的去解析抽象工厂模式简单版本的实现(也可以由上往下来分析和实现),当然说这是简单版本那肯定就还有终极版本,博主就不一一实现了,因为只要把这个版本的内容和理论理解清楚了就可以轻而易举的实现终极版本啦,最后我还是可以给点提示,我们可以采用映射+简单版抽象工厂的方式实现终极版本的,最后,加油!
原文:https://www.cnblogs.com/Alex-Liao/p/12345562.html