java设计模式(一)---工厂方法模式
来源:互联网 发布:百度免费空间域名注册 编辑:程序博客网 时间:2024/05/11 20:34
基本上有兴趣了解设计模式的都会知道工厂模式,因为各种模式相关的书籍以及博客什么的都是以工厂模式开头的,对于一时兴起或者三天热度的都是会看到工厂模式,但是工厂模式也是用到比较广泛的模式,属于创建型模式。工厂模式分为工厂方法模式和抽象工厂模式,这篇主要总结一下工厂方法模式,而工厂方法模式有细分为:简单工厂模式、工厂方法模式。还是分开了解一下
既然是工厂模式,为了自己加深理解,例子还是用工厂可以造出来的东西吧,比如手机,当然也可以是其他任何产品。
假设有三个部门(三个小项目):
销售部门(A项目)、检测部门(B项目)、体验部门(C项目),当有新的手机型号(Phone类)时,三个部门都要拿到新机(即A、B、C三个项目都要引用Phone类)。没有工厂时各个部门都要按照说明书自己创造一个新型的手机(即new一个Phone类)。如果一个产品,没有问题,但是公司要求每月添加一个新型手机,那就尴尬了。那么工厂模式就可以帮我们很好的解决这类问题。
1.简单工厂模式
简单工厂模式是一个由工厂对象决定创建出哪一种产品类的实例,又叫静态工厂方法模式。
我们先把手机功能简化一下,假设只能打电话,发短信,玩游戏,新建一个手机的抽象接口Phone。
手机有三种型号,分别为001、002、003实现方式类似,如下:
没有工厂模式时,举例体验部门,假设用玩游戏来测试:
我们发现每测试一台新的机型,都要new一个实例,代码改的太大。不光体验部门这样,其他部门也这样。这个时候可以先引入一个简单工厂模式,由工厂来生产手机,也就是new Phone,我们新建一个工厂类:
这样其他地方再需要手机的实体类,就可以直接通过工厂获得,不同的手机类型,只需要传入不同的参数即可
这就是一个简单的简单工厂模式,平常大的项目中用到的机会很少,可以自己写小程序的时候用一下
2.工厂方法模式
工厂方法模式是简单工厂的进一步抽象和推广,由于工厂方法模式具有多态性,工厂模式方法既保持了简单工厂的优点,同时又客服了它的缺点,简单工厂模式中的工厂类负责创建实例,那么如果有新的机型添加,就要修改工厂类,这样也不利于进一步松耦合。工厂方法模式中核心工厂类不负责所有实例的创建,而是将具体的创建工作交给了子类去完成,这个核心类成为了一个抽象工厂角色。
工厂方法模式设计到一下四个角色的概念:
1. 抽象工厂角色
工厂方法模式的核心,创建产品的类必须实现该接口
2. 具体工厂角色
该角色实现了抽象工厂接口,具体如何创建产品就是在该类中实现
3. 抽象产品角色
所有产品的超类,负责实现产品共性的抽象定义
4. 具体产品角色
该角色实现了抽象产品接口,负责具体不同产品的业务逻辑
承接上面的工作创建抽象工厂角色
新建创建机型001的具体工厂角色
抽象产品角色与具体产品角色已经定义过了Phone与Phone001-003
具体使用:
之前也怀疑过,这样做比简单工厂模式来说,是不是脱裤放屁,多次一举呢,后来接触的项目越来越多,才发现,一个大的项目可能需要实例化的东西太多,如果用简单工厂模式的话要不停的去修改工厂类,这样就不符合开发封闭原则,而且也很不合理,而使用工厂方法模式,只需要扩展相应的工厂类即可,不需要修改原有的代码,这样的代码才会更健壮。
- Java设计模式之工厂模式(一):简单工厂模式+工厂方法模式
- JAVA--简单工厂模式,工厂方法模式--设计模式一
- java设计模式学习(一)-工厂方法模式1
- java设计模式学习(一)-工厂方法模式2
- java设计模式(一)---工厂方法模式
- Java设计模式(一) 设计模式初探——简单工厂和工厂方法模式
- 设计模式(一):工厂方法模式
- 设计模式(一) 工厂方法模式
- 设计模式(一):工厂方法模式
- Java设计模式:工厂模式(一)简单工厂模式
- java设计模式(一)---工厂模式
- Java设计模式----工厂模式(一)
- Java设计模式(一):工厂模式
- java设计模式-(一)工厂模式
- JAVA设计模式之(简单工厂模式+工厂方法模式) (一)
- Java设计模式--工厂模式(简单工厂+工厂方法)
- Java设计模式-工厂模式(简单工厂+工厂方法)
- Java设计模式(一)设计模式的原则、工厂方法和抽象工厂
- 安装Python及环境变量配置-python简易教程(一)
- 提取图片上文字的两种方法
- 仿buychinaphone 天猫分类菜单代码 div css网站左侧分类菜单代码
- css实现多行文本溢出显示省略号(…)
- window对象用法
- java设计模式(一)---工厂方法模式
- 《Java 编程技巧1001条》 第390条 初始化多维数组
- 大龄程序员的出路在哪里?
- Maven最佳实践:版本管理
- 2017-12-22(起)学习总结
- Kotlin与Android的奇妙之旅-FindViewbyid(三)
- 异常处理try catch
- 给程序员的10条建议,吐血推荐!
- Shader实例(流光实现)