介绍

工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式。

主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软件设计的开闭原则,当我们使用工厂来生产对象的时候,我们只需要和工厂打交道就可以了。

简单工厂模式

简单工厂都有哪几个角色:

  1. 抽象产品(Car)
  2. 具体产品(WuLingCar,DaZhongCar)
  3. 具体工厂(CarFactory )
  4. 产品使用者(SimplenessFactory )

使用时通过调用工厂的 getCar() 方法,传入指定参数返回对应对象

package factory;public class SimplenessFactory {public static void main(String[] args) {Car wuling = CarFactory.getCar("wuling");wuling.wheel();Car dazhong = CarFactory.getCar("dazhong");dazhong.wheel();}
}interface Car {void wheel();
}class WuLingCar implements Car {@Overridepublic void wheel() {System.out.println("五菱车装轮子");}
}class DaZhongCar implements Car {@Overridepublic void wheel() {System.out.println("大众车装轮子");}
}class CarFactory {public static Car getCar(String name) {if (name == null) {return null;}if (name.equals("dazhong")) {return new DaZhongCar();} else if (name.equals("wuling")) {return new WuLingCar();}return null;}
}

就这样一个简单工厂就创建好了,但是这种方式创建的工厂是违反了开闭原则的,试想当我们需要新增一种车型的时候,是不是需要修改之前的代码?是的!

工厂方法模式

工厂方法模式都有哪几个角色:

  1. 抽象产品(Car)
  2. 具体产品(WuLingCar,DaZhongCar)
  3. 抽象工厂(CarFactory )
  4. 具体工厂(WuLingFactory,DaZhongFactory)
  5. 产品使用者(SimplenessFactory )

将工厂进行一层抽象,具体生产什么产品由子类决定。

和上面例子差不多,只不过这一层多了一层对工厂的抽象。

package factory;public class SimplenessFactory {public static void main(String[] args) {Car wuling = new WuLingFactory().getCar();Car dazhong = new DaZhongFactory().getCar();wuling.wheel();dazhong.wheel();}
}interface Car {void wheel();
}class WuLingCar implements Car {@Overridepublic void wheel() {System.out.println("五菱车装轮子");}
}class DaZhongCar implements Car {@Overridepublic void wheel() {System.out.println("大众车装轮子");}
}interface CarFactory {Car getCar();
}class WuLingFactory implements CarFactory {@Overridepublic Car getCar() {return new WuLingCar();}
}class DaZhongFactory implements CarFactory {@Overridepublic Car getCar() {return new DaZhongCar();}
}

工厂方法模式无疑满足了开闭原则,当需要进行扩展的时候只需要继承实现抽象工厂类和抽象产品类,就可以进行使用了。

结论

无论是结构复杂度,代码复杂度,编程复杂度,管理复杂度,简单工厂无疑是优于工厂方法模式的。

虽然说我们根据设计原则我们应该选择工厂方法模式,但是实际业务中更多的时候使用的是简单工厂模式,因为工厂方法模式从各方面来讲复杂度要高于简单工厂模式。所以有时候并不非要满足所有原则,如果为了一个原则把一段程序设计的极其复杂,也是不好的。

工厂设计模式 - 详解相关推荐

  1. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  2. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  3. 《设计模式详解》创建型模式 - 工厂模式

    <设计模式详解> 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.2.1 结构 4.2.2.2 实现 4.2.2.3 优缺点 4.2.2.4 扩展 - 静态工厂 4. ...

  4. 设计模式详解(四)抽象工厂模式

    文章目录 1. 简介 2. 代码实例 3. 抽象工厂的优缺点 1. 简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类 与工厂方法模式不同(工厂方法的升级,在工厂方法模式 ...

  5. 设计模式之工厂模式详解(附应用举例实现)

    文章目录 1 工厂模式介绍 2 工厂模式详解 2.1 简单工厂模式 2.1.1 简单工厂模式结构 2.1.2 简单工厂模式实现 2.1.3 简单工厂模式应用举例 2.2 工厂方法模式 2.2.1 工厂 ...

  6. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  7. 《设计模式详解》笔记目录

    <设计模式详解> 前言 后记 目录 设计模式概述.UML 软件设计原则 创建型模式 单例模式 工厂模式 原型模式 建造者模式 结构型模式 代理模式 适配器模式 装饰者模式 桥接模式 外观模 ...

  8. 《设计模式详解》手写简单的 Spring 框架

    自定义 Spring 框架 自定义 Spring 框架 Spring 使用回顾 Spring 核心功能结构 bean 概述 Spring IOC 相关接口 BeanFactory 接口 BeanDef ...

  9. 《设计模式详解》结构型模式 - 代理模式

    代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...

最新文章

  1. 【es6】es6学习笔记
  2. Linux数据文件自动迁移,linux下增加磁盘改变指定文件路径分区挂载点和迁移数据...
  3. 基础-栈队列简单测试
  4. java list 取几个字段组装成map_24道Java各类常见问题整理
  5. 寻路机器人单片机程序示例_C51独立按键的识别示例程序
  6. RocketMQ核心架构设计思想
  7. 前后端分离后的前端时代 1
  8. 《编程导论(Java)·9.3.1回调·3》回调的实现
  9. 卡巴斯基称新型黑客雇佣组织正在攻击欧洲律所
  10. 在Windows平台使用SSH连接Linux服务器
  11. 大数据时代的回收生意经(淼一专访)
  12. 【数学建模】基于matlab GUI干线交通控制方法【含Matlab源码 1259期】
  13. JAVA 生成API接口文档
  14. RTCM-SSR信息读取与解码
  15. PC微信小程序突然Charles抓不到包
  16. R 语言 iris 数据集的可视化
  17. latex数学公式转换器
  18. Flutter修改App名称(Android+IOS)
  19. git squash 和 git rebase
  20. 猫盘plus开启ssh登录

热门文章

  1. SAXReader的主要用法(XML)
  2. 一个实用的实时毛发渲染及着色方法
  3. 动态代理及JDK动态代理源码分析
  4. Vista桌面图标无法拖动
  5. nvm的安装配置教程
  6. 非常简单-Linux环境下(有公网IP)或虚拟主机的环境下如何做一个网站???
  7. input框点击时去掉默认的外层边框
  8. android mmm 编译指令,mm和mmm编译说明
  9. input 起止时间_input时间输入框小解
  10. 橡皮擦的英语_2019年成人高考考试,语文数学英语政治想得高分答题技巧看这里...