GOF23-工厂模式
1.什么是工厂模式
就是实现创建者与调用者分离,工厂模式的核心(灵魂)其实就是:分工。
2.工厂模式有哪些
- 简单工场模式(静态工厂)
简单工厂模式也叫静态工厂模式,就是工厂类一般使用静态方法,通过接受的参数的不同来创建不同的对象并返回。其缺点是对新增的业务类无能为力,必须要修改代码来完成扩展(不满足OCP原则)。
我们先来看下没有工程类的情况


测试类Main方法及测试结果:


我们可以看出创建对象要直接与Audi、BMW类直接打打交道。
我们再来看使用简单工厂类



可以看出,测试类并没有直接跟Audi、BMW类“直接打交道”,而是通过CarFactory来达到目的,可以理解创建对象的活已经交给CarFactory来做,不再由测试类直接创建(这也就是所谓的控制反转)。
- 工厂方法模式
创建工厂类接口,通过新增业务类,来满足新功能(满足OCP原则),缺点:结构变得更加复杂,代码更加复杂,理论上工厂方法更优,但实际我们常用简单工厂模式。
我们需要创建一个工厂接口,及对应工厂实现类。



测试类及结果

可以看出,我们是通过新增产品工厂类来实现产品对象的创建,试下如果要新增一个保时捷对象,我们此时需要怎么做?其实我们只需要新增一个保时捷的工厂类(实现CarFactory)即可。与简单工厂模式相比较:工厂方法模式结构更复杂(需要多个产品类),代码上也相对复杂,管理难度大(维护起来麻烦)。
- 抽象工厂模式
适用于生成不同产品族的全部产品,对于新产品无能为力,而是适用于产品族。比其上面两种工厂模式更复杂。
假设我们现在要创建多个接口产品,上面两种工厂模式就无能为力了。




我们目前仅创建了一个Engine接口,分别创建了超级引擎类,中端引擎类,低端引擎类。其余接口由于篇幅关系就不一一截图了,道理类似。比如:我们再增加一个座椅接口,再分别创建超级座椅,中端座椅,低端座椅。
超级引擎+超级座椅+超级轮胎=超级汽车
中端引擎+超级座椅+超级轮胎=中级汽车
……..
这就形成了不同产品族。

测试类及结果


超级汽车工厂创造出汽车引擎是超级引擎。
3.总结
- 简单工厂
即使在某种程度上不满足OCP设计原则,但是实际项目中用的最多。
- 工厂方法
在不修改已存在类的前提下,通过增加新的工厂类来达到实现扩展的目的。
- 抽象工厂
不能单独增加某个产品,可以增加产品族。
GOF23-工厂模式的更多相关文章
- GoF23:工厂模式(Factory)
目录 GoF23:工厂模式(Factory) 工厂模式三种模式 简单工厂模式(静态工厂模式) 工厂方法模式 抽象工厂模式 举例说明 代码实现 GoF23:工厂模式(Factory) 核心本质: 实例化 ...
- 设计模式之GOF23工厂模式02
抽象工厂模式 不能添加单个产品,产品族 public interface Seat { void anmo();}class GoodSeat implements Seat { @Override ...
- 【GOF23设计模式】工厂模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_简单工厂模式详解.面向对象设计原则.开闭原则.依赖反转原则.迪米特法则 没有工厂模式的情况 package com.te ...
- Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)
Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...
- GOF23设计模式之工厂模式
-实现了创建者和调用者的分离 -面向对象设计的基本原则: ·OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭 ·DIP(依赖倒转原则,Depen ...
- 【GOF23设计模式】--工厂模式
工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...
- 工厂模式的认识(GOF23)
---恢复内容开始--- 对于所有的设计模式来说,其本质是哪里变化封装哪里.寻找变化点,没有万能的模式,只有适合情况的应用 工厂模式从简单工厂开始演化 1.简单工厂的主要作用在于从源头开始封装实例化, ...
- GOF23设计模式之工厂模式(factory)
一.工厂模式概述 实现了创建者和调用者的分离 (1)分类 ①简单工厂模式 虽然某种程度不符合设计原则,但实际使用最多. ②工厂方法模式 不修改已有类的前提下,通过增加新的工厂类实现扩展. ③抽象工厂模 ...
- GOF23种设计模式-工厂模式
• 工厂模式: – 实现了创建者和调用者的分离. – 详细分类: • 简单工厂模式 • 工厂方法模式 • 抽象工厂模式 • 面向对象设计的基本原则: – OCP(开闭原则,Open-Closed Pr ...
- 设计模式GOF23之工厂模式01
简单工厂模式和工厂方法模式 工厂模式核心:分工 简单工厂模式不符合OCP(Open-Closed Princinple)原则,扩展时需要更改原代码 工厂方法模式增加了类复杂度代码复杂度等,所以一般使用 ...
随机推荐
- MS SQL SERVER数据导入MySQL
1.sql server导出到xls,再导入到mysql中.亲测,单表数据量到百万以后,导出异常,可能由其它原因导致,没细纠.此种方式需要来回倒腾数据,稍繁琐. 2.采用kettle第三方的ETL工具 ...
- Greenplum高可用真的高吗?
目录 1. 问题描述 2. 解决方案 @ 1. 问题描述 在项目中使用了Greenplum做分析型数据库,Greenplum自身已经提供了高可用方案,Master节点提供Sdanby备用节点,Segm ...
- Contiki源码分析--CPU为cc253x里的uart0.c
我所使用的Contiki系统是contiki-sensinode.理解该文需要有cc2530里uart的相关知识,具体寄存器的用法不做介绍. 先放上所有代码,然后再仔细分析. #include < ...
- Spring+MyBatis时Access denied for user '高欢欢'@'localhost' (using password: YES)的异常解决方案
今天在做spring+mybatis整合的时候系统只要一运行就会报下面的错误,搞了几个小时硬是没有找的原因 警告: com.mchange.v2.resourcepool.BasicResourceP ...
- IQueryable.Where中动态生成多个并或筛选Expression<Func<T, bool>>
直接上图
- Excel催化剂开源第36波-图片Exif信息提取,速度超快,信息超全
Excel催化剂在文件处理方面,功能做到极致,但其实很大功劳都是引用一些开源社区的轮子库,不敢独占好处,此篇给大家分享下抓取图片的Exif信息的好用的轮子. 此篇对应的Excel催化剂功能实现:第83 ...
- 描述符\get/set/delete,init/new/call,元类
6.23 自我总结 1.描述符__get__,__set__,__delete__ 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了____get__(),__set__(),__d ...
- HTML --- <a href=”#”>与 <a href=”javascript:void(0)” 的区别
<a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...
- .net持续集成sonarqube篇之 sonarqube触发webhook
系列目录 WebHook近些年来变得越来越流行,github,gitlab等代码托管平台都提供webhook功能.关于webhook这里不做详细介绍,大家可以参阅读相关互联网书籍或者材料来更深了解.可 ...
- OI/ACM最全卡常大招
NO.10: 循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(蛤?这是个什么原理,算了,反正写了没坏处就这么写吧) NO.9: 特殊运算优化:(或许这真的没用) 取 ...