前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(八):工厂方法模式

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

作者头像
xujjj
发布2019-07-12 16:27:23
3620
发布2019-07-12 16:27:23
举报
文章被收录于专栏:IT界的泥石流IT界的泥石流

什么是工厂模式

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

工厂模式的应用场景

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

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

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

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

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

工厂模式的实现

1、简单工厂模式

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

代码语言:javascript
复制
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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档