还记得前面的简单工厂模式么?我们开了一个水果工厂FruitFactory,生产三种水果ApplePearOrange。今天给大家讲讲工厂方法模式:

老板搞水果工厂赚了点小钱,准备扩大生产,每个工厂生产一种水果,各司其职,而不是把所有的产品类型都放到一个工厂中。

既然有多工厂,那我们和之前一样,搞一个水果工厂类FruitFactory,把它搞成接口类。

import factory.Fruit;
public interface FruitFactory {public Fruit getFruit();
}

水果类的定义还是一样,定义一个水果接口Fruit:

public interface Fruit {public void process();
}

水果分别如下,我直接写到一块去了:

public class Apple implements Fruit {public void process() {System.out.println("I am an Apple");}
}
public class Pear implements Fruit {public void process() {System.out.println("I am a Pear");}
}
public class Orange implements Fruit {public void process() {System.out.println("I am an Orange");}
}

既然有多个工厂。那我们分别定义多个工厂,对水果工厂类做不同的实现,分别生产苹果,雪梨,橙子。

public class AppleFactory implements FruitFactory {public Fruit getFruit(){return new Apple();}
}
public class PearFactory implements FruitFactory {public Fruit getFruit(){return new Pear();}
}
public class OrangeFactory implements FruitFactory {public Fruit getFruit(){return new Orange();}
}

测试代码如下:

public class FruitTest {public static void main(String[] args) {FruitFactory appleFactory = new AppleFactory();Fruit apple = appleFactory.getFruit();apple.process();FruitFactory pearFactory = new PearFactory();Fruit pear = pearFactory.getFruit();pear.process();}
}

运行结果:

I am an Apple
I am an Pear

上面的写法,如果后续还有生产不同的水果,或者不同的水果工厂,相对容易拓展。总结一下,工厂方法模式一共有以下的角色:

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 getFruit() 来创建水果产品。
  • 具体工厂:主要是实现抽象工厂中的抽象方法,创建具体的产品。
  • 抽象产品:定义了产品规范,比如所有的水果共同的特性。
  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

那么工厂方法模式,相对简单工厂模式,有什么区别呢?
工厂方法模式,一种工厂对应一种产品,各司其职,如果产品很多的话,方便分开维护,特别是那种创建产品比较复杂的场景,而产品类型又比较多,这样就会显得很臃肿。

但是如果产品很少,而且创建过程相对简单的时候,感觉简单工厂模式已经足够,不需要特意为了使用一种设计模式而使用它,过度设计会带了很多不必要的麻烦。

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?相关推荐

  1. 虚拟机的安装和linux操作系统(RedHat.8.5)的安装。将虚拟机的网络连接模式分别调换成仅主机模式,nat模式,桥接模式并获取ip地址使用ssh通过不同用户远程连接。在linux系统下破解密码

    目录 一.在VMware上如何创建虚拟机以及安装linux操作系统. 二.修改主机名为server.local. 三.将虚拟机的网络连接模式分别调换成仅主机模式,nat模式,桥接模式并获取ip地址使用 ...

  2. 设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?

    还记得之前的工厂方法模式么?现在老板更加富有了,除了水果,还准备搞点其他的生意,再做点服装生意.水果工厂和服装工厂明显就不是同一种东西,肯定不能放到一个工厂里面生产,服装也有好几种,但是不同的工厂,也 ...

  3. 虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...

    安装虚拟机,默认情况下,联网的模式是NAT,即跟主机是转发共用网络资源的,这样就非常慢,时常网页都打不开,现把它改成桥接模式,让它独立成为一台物理机,网速有大大的改善,设置操作如下: VM --> ...

  4. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

  5. 《复杂》读书笔记(part1)--一些思想是由简单的思想组合而成,我称此为复杂

    学习笔记 学习书目:<复杂>- 梅拉妮·米歇尔 文章目录 复杂是什么 复杂系统的共性 如何度量复杂性 复杂是什么 一些思想是由简单的思想组合而成,我称此为复杂:比如美.感激.人.军队.宇宙 ...

  6. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  7. 最简单java设计模式:工厂方法模式

    前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...

  8. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  9. 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)

    工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...

最新文章

  1. 没有好看的 Terminal 怎么能够快乐地写代码
  2. 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )
  3. HALCON示例程序forest.hdev识别森林中的树
  4. 【机器学习】 - import cv2 opencv安装python
  5. python--反射机制
  6. java算法-递归算法思想
  7. 2022-2028年中国差旅管理行业市场行情动态及投资潜力研究报告
  8. mac安装xbox驱动
  9. 计算机课ppt实验报告,北邮计算机组成原理实验课件_bupt 计算机组成原理 实验报告,北邮 计算机 计组实验-讲义工具类资源...
  10. iCollections for Mac(桌面图标及文件整理工具)
  11. 解决模拟人生3(SIM 3)闪退问题
  12. 设备巡检维修报备小程序开发制作功能介绍
  13. 调节笔记本外接显示器亮度
  14. OCP认证的优势是什么
  15. Excel 2016 做线性回归分析【高尔顿数据集】与【Anscombe四重奏数据集】
  16. 论文写作技巧----公式
  17. 自定义select标签
  18. Linux下Firefox中配置Jre
  19. 哈工大操作系统学习笔记五——内核级线程实现
  20. 这些书你看过了多少?

热门文章

  1. Photoshop辅助线和标尺的技巧
  2. QQ邮箱获取和使用授权码
  3. android拍照保存照片方向,android 拍照的照片方向问题,读取图片EXIF信息
  4. 22款奔驰S400L升级原厂主动氛围灯,H17钢琴条纹饰板等,浪漫奢华
  5. HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信
  6. AUTOSAR架构软件结构简介
  7. idea svn插件离线安装_idea离线安装lombock插件
  8. 关于工作中的相关问题的看法和建议 (一)JAVA小组的调整问题
  9. 智慧停车服务器及存储系统设计,浅谈:停车场管理系统系统组成
  10. linux 截取某一段时间的日志,存储到另一个文件中