目录

  • 概括
  • 目的
  • 主要解决
  • 何时使用
  • 使用场景
  • 总结
  • 三种工厂模式的对比
  • 代码示例

概括

定义一个用于创建对象的接口,让子类决定实例化哪一个类。使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符,工厂方法 使一个类的实例化延迟到其子类。)

目的

工厂方法的目的是使得创建对象和使用对象是分离的,并且客户端总是引用抽象工厂和抽象产品。

主要解决

主要解决接口选择的问题。

何时使用

我们明确地计划不同条件下创建不同实例时。

使用场景

作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。

总结

工厂方法,将多个具有相同功能(具体实现不相同)的不同类抽象为一个抽象类,并提供一个工厂方法代替对于对象构造函数的直接调用(只返回抽象类)。客户端通过工厂方法的参数指定具体的类型,将返回的具体类当抽象类使用(无需关心具体类的实现方式)。

工厂方法可以隐藏创建产品的细节,且不一定每次都会真正创建产品,完全可以返回缓存的产品,从而提升速度并减少内存消耗。

三种工厂模式的对比

三种工厂模式都封装了对象创建的过程,调用方通过抽象工厂获取抽象产品,调用方只使用抽象产品。

简单工厂:所有产品都由一个工厂创建,根据参数创建不同产品,因此每次添加新产品,都需要修改工厂的方法。

工厂方法:每个产品都有相应的工厂实现了,由调用方决定使用实例化哪个工厂。工厂方法的工厂用来创建一种产品(如:鼠标工厂创建鼠标、键盘工厂键盘)。

抽象工厂:工厂方法的增强,每个工厂可以创建一系列相关的产品(如小米工厂可以创建小米鼠标、小米键盘; 华为工厂可以创建华为鼠标,华为键盘)。可以认为抽象工厂是对工厂方法的组合

代码示例

  • 步骤一
    创建一个接口
  public interface Shape {void draw();}
  • 步骤二
    创建实现接口的实体类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}}javapublic class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}}
  • 步骤三
    创建一个工厂,生成基于给定信息的实体类的对象。
public class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType == null){return null;}        if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}}
  • 步骤四
    使用该工厂,通过传递类型信息来获取实体类的对象。
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();//获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象,并调用它的 draw 方法Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象,并调用它的 draw 方法Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();}}
  • 步骤五
    执行程序,输出结果:
    Inside Circle::draw() method.
    Inside Rectangle::draw() method.
    Inside Square::draw() method.

设计模式(一):工厂方法相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  4. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  5. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  6. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  7. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  8. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  9. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  10. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

最新文章

  1. 简单介绍SQLserver中的declare变量用法
  2. C#学习基本概念之结构与类
  3. hdu 4417 Super Mario 划分树+二分
  4. tensorflow random的用法
  5. IDEA的maven项目报错BeanCreationException: Error creating bean with name “xxxController”
  6. C#调用 Halcon引擎执行代码
  7. java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区
  8. 【数据结构与算法】数组与链表
  9. Java基础(六) static五大应用场景
  10. SAP License:未清项启用
  11. mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏
  12. java编程手册_Java编程手册
  13. Profinet协议生成GSD文件教程
  14. 盘点下玩过的解谜游戏
  15. c++ atuo_ptr 的实现原理
  16. fx5800p编程教程_fx5800P编程计算器操作方法.pdf
  17. XP找不到清理桌面向导的解决办法
  18. 贝叶斯模型构建分类器的设计与实现
  19. python 去掉字符串头尾及内部指定字符
  20. 基于QT和Node.js的八叉树算法提取图片主题色

热门文章

  1. Cities(2020昆明C)
  2. CodeForces 1491G Switch and Flip(结论)
  3. P7295-[USACO21JAN]Paint by Letters P【平面图欧拉公式】
  4. P5304-[GXOI/GZOI2019]旅行者【最短路】
  5. 野鸡NOI.AC模拟赛【2019.10.26】
  6. P3901-数列找不同【模拟】
  7. 学习手记(2018.11.30~2019.6.6)——养老时间
  8. P1407-[国家集训队]稳定婚姻【tarjan,强连通分量】
  9. P1311,jzoj3025-选择客栈【统计】
  10. 【线段树】海报(loj 3264)