工厂模式的一点想法
2015-12-02 22:50
260 查看
最近,一直在学习设计模式方面的知识,可能经历单例模式之后就是工厂模式,那么工厂模式到底有哪些优越性呢,围绕着静态工厂,工厂方法,抽象工厂展开的书籍枚不胜数,那么什么是工厂呢?为什么要使用工厂呢?
工厂--简单理解就是一个容器,需要什么就去取什么的容器,这是最基本最浅显的一种理解,在工厂里面还可以做哪些事情呢,这不得不提到一个概念工厂的工厂,就是制作工厂的一个容器,这个容器可不可以理解是一个顶级容器呢,所有的资源都是依赖于这个容器的,当跳出这个容器,看到这个顶级容器的时候,基本就知道这个工厂模式是什么意思了。在具体的工厂容器中,负责具体模块的功能,在顶级容器负责将各个容器的资源进行整合,如果我们在设计一个架构的时候,往往需要先构思这个顶级容器需要做哪些事情,就是提供哪些接口,具体的拓展就是在这个顶级容器中完成的,这个时候也就不要谈什么设计原则了,只能在这个顶级容器里面扩展了,就好比没有了杯子,怎么去用杯子装水呢。顶级容器负责制定一系列规则,将职能细分,然后由具体的职能容器负责职能实现。
为了表述的更加完成,还是对工厂模式做一个细分
1、简单工厂模式
简单工厂又称为静态工厂,因为负责具体实例的创建,所以为了避免工厂实例化,一般将工厂设计为静态工厂,也将构造器设置为私有构造器,如果需要工厂创建实例,只需要在这个工厂中添加对应的处理方法即可,但是这种模式违背了OCP原则(OPEN-CLOSED-PRINCIPLE)。
2、工厂方法模式
在简单工厂的基础上做一个一次抽象,即创建一个工厂接口,具体的实例分别由具体的工厂创建,这样创建实例的时候只需要调用具体工厂的方法即可,但是这样也存在一个问题,需要实例化工厂,同时,也给程序的结构增加了复杂度,但是该模式符合OCP原则。
3、抽象工厂模式
抽象工厂模式是简单工厂模式和工厂方法模式的一种妥协吧,对创建的实例进行分组,同组实例由一个工厂进行管理,这种方式类似于简单工厂,不同组之间通过一个工厂管理,这种方式类似于工厂方法,为什么笔者会有此联想呢,抽象工厂所解决的问题就是一种多维度的问题,应对多维度,避免应对每一种情况创建一个工厂而导致系统结构的复杂性,但为了保证按照组进行系统扩展。因此对于组类的扩展是违背了OCP原则,但是对于组外扩展是符合OCP原则的。
以上,是笔者对于工厂模式的一种理解,还请路过人提出一些宝贵的建议
工厂--简单理解就是一个容器,需要什么就去取什么的容器,这是最基本最浅显的一种理解,在工厂里面还可以做哪些事情呢,这不得不提到一个概念工厂的工厂,就是制作工厂的一个容器,这个容器可不可以理解是一个顶级容器呢,所有的资源都是依赖于这个容器的,当跳出这个容器,看到这个顶级容器的时候,基本就知道这个工厂模式是什么意思了。在具体的工厂容器中,负责具体模块的功能,在顶级容器负责将各个容器的资源进行整合,如果我们在设计一个架构的时候,往往需要先构思这个顶级容器需要做哪些事情,就是提供哪些接口,具体的拓展就是在这个顶级容器中完成的,这个时候也就不要谈什么设计原则了,只能在这个顶级容器里面扩展了,就好比没有了杯子,怎么去用杯子装水呢。顶级容器负责制定一系列规则,将职能细分,然后由具体的职能容器负责职能实现。
为了表述的更加完成,还是对工厂模式做一个细分
1、简单工厂模式
简单工厂又称为静态工厂,因为负责具体实例的创建,所以为了避免工厂实例化,一般将工厂设计为静态工厂,也将构造器设置为私有构造器,如果需要工厂创建实例,只需要在这个工厂中添加对应的处理方法即可,但是这种模式违背了OCP原则(OPEN-CLOSED-PRINCIPLE)。
2、工厂方法模式
在简单工厂的基础上做一个一次抽象,即创建一个工厂接口,具体的实例分别由具体的工厂创建,这样创建实例的时候只需要调用具体工厂的方法即可,但是这样也存在一个问题,需要实例化工厂,同时,也给程序的结构增加了复杂度,但是该模式符合OCP原则。
3、抽象工厂模式
抽象工厂模式是简单工厂模式和工厂方法模式的一种妥协吧,对创建的实例进行分组,同组实例由一个工厂进行管理,这种方式类似于简单工厂,不同组之间通过一个工厂管理,这种方式类似于工厂方法,为什么笔者会有此联想呢,抽象工厂所解决的问题就是一种多维度的问题,应对多维度,避免应对每一种情况创建一个工厂而导致系统结构的复杂性,但为了保证按照组进行系统扩展。因此对于组类的扩展是违背了OCP原则,但是对于组外扩展是符合OCP原则的。
以上,是笔者对于工厂模式的一种理解,还请路过人提出一些宝贵的建议
相关文章推荐
- html5利用websocket完成的推送功能
- zoj 3005 Bacteria Colony
- MyEclipse 启动报错:'Building workspace' has encountered a problem解决方法
- vmstat命令详解
- Julia: 如何一次性insert Array{Any,2} to SQLite DB?
- SCN号与oracle数据库恢复的关系
- Android自定义控件——Indicator
- 小议如何使用APPLY
- “数学口袋精灵”第二个Sprint计划(第九天)
- 阶乘的精确值
- vs2010 2013 2015+ 必备插件精选 分享 0
- 第一讲 递归与循环1
- memcpy与memmove区别
- .NET程序员学PHP要注意的坑-类、接口
- 《如何高效学习》读书笔记(三)——超越整体学习
- 《如何高效学习》读书笔记(二)——整体性学习技术
- [傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论
- 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题
- Python下载网页图片
- 内存管理初级