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)原则,扩展时需要更改原代码 工厂方法模式增加了类复杂度代码复杂度等,所以一般使用 ...
随机推荐
- MYSQL千万级别数据量迁移Elasticsearch5.6.1实战
从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行. Elasticsearch-jdbc,Githu ...
- springboot项目问题记录one
上面三个方法描述如下: 首先有个业务,我是需要调取第三方一个sdk,然后sdk里面封装的kafka,也就是说,需要用sdk内置的连接kafka去消费消息,然后又有一个类需要实现Message,此Mes ...
- TreeMap原理实现及常用方法
目录 一. TreeMap概述 二. 红黑树回顾 三. TreeMap构造 四. put方法 五. get 方法 六. remove方法 七. 遍历 八. 总结 前面我们分别讲了Map接口的两个实现类 ...
- Spring框架之IoC和AOP
Spring框架简介: 2003年2月,Spring框架正式成为一个开源项目,并发布于SourceForge中.致力于Java EE应用的各种解决方案,而并不是仅仅专注于某一层的方案,是企业应用开发的 ...
- 基于TCP协议的套接字编程
06.26自我总结 1.关于Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在 ...
- 利用gcc编译链接时出现 ‘undefined reference to `std::ios_base::Init::Init()’ 解决
一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c ...
- “朕赐给你,才是你的;朕不给,你不能抢”--custome role在Azure权限管理中的简单实践
在开始详细讨论技术问题之前,有一些个人观点想发表一下: ---作为一个甲方云平台的掌控着,如果任何事情你都是让partner全部帮你搞定,自己既不审核也不研究,那无论是对于公司还是个人发展来说都是没任 ...
- JAVA面试题 String s = new String("xyz");产生了几个对象?
面试官Q1:请问String s = new String("xyz");产生了几个对象? 对于这个Java面试题,老套路先上代码: public class StringTest ...
- [译].Net中的内存
原文链接:https://jonskeet.uk/csharp/memory.html 人们在理解值类型和引用类型之间的差异时因为“值类型在栈上分配,引用类型在堆上分配”这句话造成了很多混乱.这完全是 ...
- JavaScript的面向对象原理之原型链
二.JavaScript的对象 为了能够清楚的解释这一切,我先从对象讲起.从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的. 实际上在JS ...