美文网首页Java设计模式设计模式
《设计模式》简单工厂模式

《设计模式》简单工厂模式

作者: 敏捷Studio | 来源:发表于2019-08-08 16:35 被阅读1次

定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。

介绍

  • 简单工厂模式属于创建型模式。
  • 简单工厂模式又叫做静态工厂方法模式。

UML类图

简单工厂模式UML类图

角色说明:

  • Product(抽象产品类):要创建的复杂对象,定义对象的公共接口。
  • ConcreteProduct(具体产品类):实现Product接口。
  • Factory(工厂类):返回ConcreteProduct实例。

实现

1、创建抽象产品类,定义公共接口:

// 抽象产品类 
public abstract class Product {
  public abstract void show();
}

2、创建具体产品类,继承Product类:

// 具体产品类A 
public class ProductA extends Product {
  @Override
  public void show() {
    System.out.println("product A");
  }
}
// 具体产品类B
public class ProductB extends Product {
  @Override
  public void show() {
    System.out.println("product B");
  }
}

3、创建工厂类,创建具体的产品:

public class Factory {
  public static Product create(String productName) {
    Product product = null;
    // 通过switch语句控制生产哪种商品
    switch (productName) {
      case "A":
        product = new ProductA();
        break;
      case "B":
        product = new ProductB();
        break;
    }
    return product;
  }
}

4、测试方法:

public void test() {
  // 生产ProductA
  Factory.create("A").show();
  // 生产ProductB
  Factory.create("B").show();
  try {
    // 生产ProductC
    Factory.create("C").show();
  } catch (NullPointerException e) {
    System.out.println("没有ProductC");
  }
}

应用场景

生成复杂对象时,确定只有一个工厂类,可以使用简单工厂模式。否则有多个工厂类的话,使用工厂方法模式

优缺点

优点

  • 代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。

缺点

  • 违背开放封闭原则,若需添加新产品则必须修改工厂类逻辑,会造成工厂逻辑过于复杂。
  • 简单工厂模式使用了静态工厂方法,因此静态方法不能被继承和重写。
  • 工厂类包含了所有实例(产品)的创建逻辑,若工厂类出错,则会造成整个系统都会会受到影响。

简单工厂进化

1、工厂方法模式 VS 简单工厂模式

  • 工厂方法模式有抽象工厂类,简单工厂模式没有抽象工厂类且其工厂类的工厂方法是静态的。
  • 工厂方法模式新增产品时只需新建一个工厂类即可,符合开放封闭原则;而简单工厂模式需要直接修改工厂类,违反了开放封闭原则

2、简单工厂模式的优化(反射实现)
由于简单工厂模式新增产品时需要直接修改工厂类,违反了开放封闭原则。因此可以使用反射来创建实例对象,确保能够遵循开放封闭原则

public class Factory {
  public static <T extends Product> T create(Class<T> clz) {
    Product product = null;
    try {
      // 反射出实例
      product = (Product) Class.forName(clz.getName()).newInstance();
    } catch (Exception e) {
       e.printStackTrace();
    }
    return (T) product;
  }
}

测试方法

public void test() {
  // 生产ProductA
  Factory.create(ProductA.class).show();
  // 生产ProductB
  Factory.create(ProductB.class).show();
}

3、 总结
使用反射来实现工厂类,新增产品时无需修改工厂类,但是使用反射来创建实例对象的话会比正常使用new来创建的要慢。

相关文章

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • 设计模式

    设计模式(视频总结) [TOC] 一、简单工厂模式(Simple Factory) 简单工厂模式: 简单工厂模式属...

  • iOS设计模式-工厂模式

    工厂模式分为简单工厂模式,工厂模式、抽象工厂模式三类。 简单工厂模式 1. 定义 简单工厂模式并不是常用的设计模式...

  • Android设计模式:工厂设计模式

    目录 简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式是所有工厂模式的基础,不属于23种设计模式范...

  • 相近设计模式比较

    设计模式干货: 简单工厂模式 vs. 工厂模式 vs. 抽象工厂模式简单工厂和工厂模式区别? 简单工厂没有多个子类...

  • 三、创建型模型

    简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 1.简单工厂模式 简单工厂模式并不属于23种设计模式。 不难看...

  • 简单工厂模式

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

网友评论

    本文标题:《设计模式》简单工厂模式

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