美文网首页
创建型模式之工厂方法模式

创建型模式之工厂方法模式

作者: 叶深人静 | 来源:发表于2017-06-15 11:03 被阅读5次

一、定义

工厂方法模式:将对象的创建封装到工厂中去实现。
说道工厂方法模式我们一定会想到和它相关联的简单工厂模式和抽象工厂模式,简单工厂模式非常简单,这里我们不作讨论,抽象工厂模式下节讨论。

二、应用场景

当我们要创建的对象种类不确定时,后期有可能改变时,工厂方法模式比较适合。
比如:现在很多app都有消息中心,消息中心里包括很多消息类型,而每种消息类型的样式又不一样,并且随着版本的迭代还会增加很多消息类型,这时候用工厂方法模式就再合适不过了。

三、类图

工厂方法模式类图.png

四、模式的简单实现

其实工厂方法模式相对来说也比较简单,接下来我们还是以卖果汁的小店为例来演示一下工厂方法。
我们知道果汁店不止一种果汁,根据多态,我们将果汁抽象化。

public interface IJuice {
  void make();
}

接下来我们实现几个具体的产品,假设有苹果汁、芒果汁、草莓汁。

public class AppleJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make apple juice");
  }
}

public class MangoJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make mango juice");
  }
}

public class StrawberryJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make strawberry juice");
  }
}

接下来是工厂类:

public class JuiceFactory {
  public IJuice static makeJuice(String name){
    if("apple".equals(name)){
      return new AppleJuice();
    }else if("mango".equals(name)){
      return new MangoJuice();
    }else if("strawberry".equals(name)){
      return new StrawberryJuice();
    }
    return null;
  }
}

接下来是场景类:

public class Client {
  public static void main(String[] args) {
    IJuice juice = JuiceFactory.makeJuice("apple");
    juice.make();
  }
}

根据点的果汁名字去制作相应的果汁,这时如果果汁店又加了两种果汁,葡萄汁和西瓜汁,我们还要去修改相应的JuiceFactory类里的逻辑,这会造成维护的成本太大,根据开闭原则,即对扩展开放,对修改关闭,我们修改下工厂类,实现具体工厂生产具体产品。
抽象工厂:

public interface IJuiceFactory {
  IJuice makeJuice();
}

具体工厂:

public class AppleJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new AppleJuice();
  }
}

public class MangoJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new MangoJuice();
  }
}

public class StrawberryJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new StrawberryJuice();
  }
}

场景类:

public class Client {
  public static void main(String[] args) {
    IJuiceFactory juiceFactory = new AppleJuiceFactory();
    IJuice juice = juiceFactory.makeJuice();
    juice.make();
  }
}

假如这时我们增加了葡萄汁,我们只需要增加一个具体工厂类和具体产品类即可,其他什么都不用改,这样我们维护起来就比较easy。

public class GrapeJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make grape juice");
  }
}

public class GrapeJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new GrapeJuice();
  }
}

五、总结

工厂方法模式就是将对象的创建放到具体的工厂类中去实现,因此对于多种种类的产品时,可以使用工厂方法模式进行解耦。
优点:扩展性比较好,当有新的产品产生时,不用修改现有的逻辑,只需要增加一个产品类和工厂类即可。降低了代码之间的耦合度,修改一种产品时并不会影响其他产品。
缺点:当产品种类较多时,会导致类过多,增加类定义的内存开销。

相关文章

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式IOC与工厂方法模式的结合泛型工厂委托工厂 创建型模式 创建型模式可以隔离客...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • Kotlin(八)kotlin设计模式-创建型

    创建型模式 - 工厂 Kotlin里面几种主流创建型设计模式:工厂方法模式,抽象工厂模式,构建者模式 8.1 伴生...

  • 工厂方法模式

    什么是工厂方法模式 工厂方法模式又称为工厂模式,属于创建型设计模式。工厂方法模式定义了一个创建对象的接口,但由子类...

  • 简单工厂模式

    工厂方法模式(Factory Pattern)是创建型设计模式之一。 一、定义 简单工厂模式又称为静态方法工厂模式...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • JavaScript 23种设计模式

    创建型: 抽象工厂模式(Abstract Factory) 构建者模式(Builder) 工厂方法模式(Facto...

  • 设计模式[2]-工厂方法模式-Factory Method Pa

    1. 工厂方法模式简介 工厂方法模式(Factory Method Pattern)是创建型的设计模式,和简单工厂...

  • 工厂模式-简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式 工厂模式是一种比较常见的创建型设计模式,分为简单工厂模式、工厂方法模式、抽象工厂模式 工厂模式旨在把对象...

  • 设计模式[3]-抽象工厂模式-Abstract Factory

    1.抽象工厂模式介绍 抽象工厂模式是创建型设计模式,可以创建一组对象。与工厂方法模式相比,抽象工厂模式中的具体工厂...

网友评论

      本文标题:创建型模式之工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/iywvfxtx.html