Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式(八):工厂方法模式

设计模式(八):工厂方法模式

作者头像
xujjj
发布于 2019-07-12 08:27:23
发布于 2019-07-12 08:27:23
39400
代码可运行
举报
文章被收录于专栏:IT界的泥石流IT界的泥石流
运行总次数:0
代码可运行

什么是工厂模式

定义用于创建对象的接口,让子类决定创建哪个类的实例。工厂方法允许类的实例化延迟到子类。

工厂模式的应用场景

在面向对象编程中创建对象实例,我们通常会使用 new 关键词来实例化对象,很多情况下我们可以直接 new 一个对象实例。但是在一些情况下,如果需要完成一系列步骤才能创建一个对象实例,这样就容易造成使用者使用的不便以及代码的繁杂混乱。从使用者角度来看,若每次创建对象都要写重复好长的一段创建实例代码,是非常不友好的,希望创建方式越简单越好。这时候就可以使用工厂模式来替代 new 对象实例的方法,把创建过程交给工厂类去处理,需要的实例对象直接从工厂里获取。

联系实际,我们想要一件衣服,我们不需要自己生产衣服,也不需要知道衣服是怎么做,只需要给钱向店家买就好了,交钱给衣服就这么简单,简单是我们的,麻烦是店家的。

工厂方法模式的主要优点有:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道如何创建产品;
  • 在业务增加新的产品时只需要添加新的产品工厂类和产品类,无须对原工厂进行修改,满足开闭原则;

而工厂方法模式的缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度。

工厂模式的实现

1、简单工厂模式

简单工厂模式通过专门定义一个工厂类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。将类的创建过程全都交给工厂处理,用户只需要告诉工厂需要什么实例即可。具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Clothes {
  void desc();
}

class TShirt implements Clothes {
  @Override
  public void desc() {
    System.out.println("I'm TShirt");
  }
}

class PoloShirt implements Clothes {
  @Override
  public void desc() {
    System.out.println("I'm PoloShirt");
  }
}
public class SimpleFactory {
  public Clothes productClothes(String clothesName) {
    Clothes clothes = null;
    switch (clothesName) {
      case "TShirt":
        clothes = new TShirt();
        break;
      case "PoloShirt":
        clothes = new PoloShirt();
        break;
    }
    return clothes;
  }
}

简单工厂模式的优点:

将创建实例的工作交给工厂处理,使用者不需关心对象实例如何创建的,只管使用即可,实现了代码解耦作用,更易于维护。

简单工厂模式的缺点:

  • 违背了开放封闭原则,若业务新增了产品,就需要修改工厂类的逻辑,若产品越来越多,会造成工厂类代码庞大,逻辑复杂。
  • 工厂类负责所有产品的创建,一旦工厂类不能正常工作,会影响整个系统,存在一定的风险。

2、工厂方法模式

为了解决简单工厂模式存在的缺点,就产生了工厂方法模式。工厂方法模式是对简单工厂模式进一步的解耦,每一个产品对应一个产品工厂类和产品类,把原本因为业务代码而庞大的工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了,符合开放封闭原则。我们将上面的代码调整如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Clothes {
  void desc();
}

class TShirt implements Clothes {
  @Override
  public void desc() {
    System.out.println("I'm TShirt");
  }
}

class PoloShirt implements Clothes {
  @Override
  public void desc() {
    System.out.println("I'm PoloShirt");
  }
}

interface IFactory {
  Clothes produce(String prudct);
}

class TShirtFactory implements IFactory {
  @Override
  public Clothes produce(String prudct) {
    Clothes clothes = new TShirt();
    return clothes;
  }
}

class PoloShirtFactory implements IFactory {
  @Override
  public Clothes produce(String prudct) {
    Clothes clothes = new PoloShirt();
    return clothes;
  }
}

以后若需要新增产品,只需要实现 IFactory 接口创建新的工厂类,使用特定的工厂生产特定的产品。

工厂方法模式解决了简单工厂模式会违背开放封闭原则的问题,又向用户屏蔽具体实现细节,保持了面向对象编程的优点;多个工厂工作,降低生产风险。

但工厂方法模式也有个很明显的缺点就是每增加一个产品类,就需要增加一个对应的工厂类,无形增加了额外的工作量。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的泥石流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式(九):抽象工厂模
它属于创建型模式。在抽象工厂模式中,每个具体工厂都提供了多个用于创建多种不同类型具体对象的方法,这些不同类型的对象都存在一个共同的属性,构成一个族。
xujjj
2019/07/22
3770
[设计模式]工厂方法模式
简介 工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。  工厂模式是一种类创建型模式 (可参考 设计模式 创
静默虚空
2018/01/05
6150
[设计模式]工厂方法模式
工厂方法模式
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 ——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
2350
工厂方法模式
聊聊设计模式之工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
Bug开发工程师
2018/07/23
3630
聊聊设计模式之工厂方法模式
设计模式 | 工厂方法模式及典型应用
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
小旋锋
2019/01/21
1.3K0
一文搞懂设计模式—工厂方法模式
在面向对象设计中,经常需要创建对象实例。传统的方式是在代码中直接使用 new 关键字来创建对象,但这种方式可能会导致高耦合和难以扩展。
BookSea
2024/02/29
2330
一文搞懂设计模式—工厂方法模式
23种设计模式(2):工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
全栈程序员站长
2022/07/09
1950
23种设计模式(2):工厂方法模式
工厂方法模式(Factory Method)-最易懂的设计模式解析
在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题:
Carson.Ho
2019/02/22
1.3K0
大牧絮叨设计模式:工厂方法模式
工厂方法模式是一种创建模式,又被称为虚拟构造子模式(Virtual Constructor)或者多态性工厂模式(Polymoriphoic Factory)。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
大牧莫邪
2019/07/16
4120
大牧絮叨设计模式:工厂方法模式
设计模式—— 八 :工厂方法模式
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定 义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂 ConcreteCreator完成的。
三分恶
2020/07/16
3260
设计模式之三(工厂方法模式)
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到其子类。
aehyok
2018/09/11
3980
设计模式之三(工厂方法模式)
设计模式-工厂方法模式
在简单工厂模式中,我们发现存在很多问题: 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。 要新增产品类的时候,就要修改工厂类的代码,违反了开放封闭原则(对扩展的开放,对修改的关闭)。 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。 为了解决上述的问题,我们学习一种新的设计模式:工厂方法模式。 模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 设计原则 依赖倒置原则:要依赖抽象,不要依赖具体类。
武培轩
2018/04/18
5350
设计模式-工厂方法模式
工厂方法模式
上文描述了简单工厂模式,但是简单工厂模式并不属于23种设计模式。所以本文我们介绍简单工厂模式的高级实现。在此之前先看一下简单工厂模式所存在的问题。预留问题:
乱敲代码
2020/05/21
3440
设计模式之工厂方法模式
工厂方法模式(Factory Method),是23种设计模式之一。DP中是这么定义工厂方法模式的:
端碗吹水
2020/09/23
3050
设计模式之工厂方法模式
Carson带你学设计模式:工厂方法模式(Factory Method)
在上文提到的Carson带你学设计模式:简单工厂模式(SimpleFactoryPattern),发现简单工厂模式存在一系列问题:
Carson.Ho
2022/03/25
2220
Carson带你学设计模式:工厂方法模式(Factory Method)
工厂方法模式
工厂方法模式(Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
卡尔曼和玻尔兹曼谁曼
2019/01/25
3660
工厂方法模式
一起学习设计模式--03.工厂方法模式
简单工厂模式虽然简单,但是存在一个很严重的问题:由于静态工厂方法是根据传入的参数不同来创建不同的产品的,所以当系统中需要引入新产品时,就需要修改工厂类的源代码,这将违背开闭原则。为了实现增加新产品而不修改原有代码,工厂方法模式应运而生。
独立观察员
2022/12/06
4520
一起学习设计模式--03.工厂方法模式
设计模式之 工厂模式
简单工厂模式 : 简单工厂模式是属于创建型的设计模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式,简单工厂模式是由一个工厂决定创建哪一类产品的实例,简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
用户3094376
2018/09/12
5440
设计模式之 工厂模式
工厂方法模式
高爽
2017/12/28
5660
工厂方法模式
设计模式 (5)——工厂方法模式(Factory Method,创建型)
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
恋喵大鲤鱼
2018/08/03
3760
设计模式 (5)——工厂方法模式(Factory Method,创建型)
相关推荐
设计模式(九):抽象工厂模
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验