最全工厂设计模式案例详解,不服来辩!

简介: 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,今天我们一起来彻底解析一下它。

一、介绍

从名称上,顾名思义就是创建产品,按类别分为简单工厂模式工厂方法模式抽象工厂模式,主要功能都是帮助我们把对象的实例化操作单独抽取出来,优化系统架构,增强系统的扩展性。

下面,我们一起来看看各个模式的使用方式。

二、简单工厂模式

简单工厂模式,对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。

19.jpg

  • 创建一个接口
public interface Product {
   void operation1();
   void operation2();
}
  • 创建实现接口的实体类
public class ConcreateProductA implements Product{
   @Override
   public void operation1() {
      System.out.println("产品A,执行任务1");
   }
   @Override
   public void operation2() {
      System.out.println("产品A,执行任务2");
   }
}
public class ConcreateProductB implements Product{
   @Override
   public void operation1() {
      System.out.println("产品B,执行任务1");
   }
   @Override
   public void operation2() {
      System.out.println("产品B,执行任务2");
   }
}
  • 创建一个工厂,生成基于给定信息的实体类的对象
public class SimpleFactory {
   //使用 create 方法获取形状类型的对象
   public Product create(String productType){
      if(productType == null){
         return null;
      }
      if(productType.equalsIgnoreCase("productA")){
         return new ConcreateProductA();
      }
      if(productType.equalsIgnoreCase("productB")){
         return new ConcreateProductB();
      }
      return null;
   }
}
  • 编写客户端测试类,使用该工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo {
   public static void main(String[] args) {
      SimpleFactory simpleFactory = new SimpleFactory();
      //获取 productA 的对象
      Product productA = simpleFactory.create("productA");
      //调用 productA 的 operation1、operation2 方法
      productA.operation1();
      productA.operation2();
      //获取 productB 的对象
      Product productB = simpleFactory.create("productB");
      //调用 productB 的 operation1、operation2 方法
      productB.operation1();
      productB.operation2();
   }
}
  • 执行程序,输出结果:
产品A,执行任务1
产品A,执行任务2
产品B,执行任务1
产品B,执行任务2

当然,还可以将创建对象方式进行改进,将SimpleFactory类创建对象的方式改成如下方式:

public class SimpleFactory {
   //反射机制获取实体类
   public <T> T createByClazzName(Class<? extends T> clazz){
  T obj = null;
  try {
   obj = (T) Class.forName(clazz.getName()).newInstance();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return obj;
 }
}

这样做的好处是,当有新的产品加入时,不用修改工厂类,在调用的时候,采用如下方式即可获取对象!

Product product = new SimpleFactory().create("类名.class");

三、工厂方法模式

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。

20.jpg

  • 创建一个工厂接口
public interface FactoryProduct {
   Product create();
}
  • 创建实现接口的实体类
public class ConcreateFactoryA implements FactoryProduct{
   @Override
   public Product create() {
      return new ConcreateProductA();
   }
}
public class ConcreateFactoryB implements FactoryProduct{
   @Override
   public Product create() {
      return new ConcreateProductB();
   }
}
  • 编写客户端测试类,使用该工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo {
   public static void main(String[] args) {
      //获取 productA 的对象
      Product productA = new ConcreateFactoryA().create();
      //调用 productA 的 operation1、operation2 方法
      productA.operation1();
      productA.operation2();
      //获取 productB 的对象
      Product productA = new ConcreateFactoryB().create();
      //调用 productB 的 operation1、operation2 方法
      productB.operation1();
      productB.operation2();
   }
}
  • 执行程序,输出结果:
产品A,执行任务1
产品A,执行任务2
产品B,执行任务1
产品B,执行任务2

四、抽象工厂模式

抽象工厂模式主要是应对产品族概念提出来的。提供一个创建一系列相关或相互依赖的对象。

21.jpg

  • 为形状创建一个接口
public interface Shape {
   void draw();
}
  • 创建实现接口的实体类
public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}
public class Square implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}
public class Circle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}
  • 为颜色创建一个接口
public interface Color {
   void fill();
}
相关文章
|
2月前
|
设计模式 Java
设计模式之工厂
设计模式之工厂
|
9天前
|
设计模式 Java 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
|
2月前
|
设计模式
设计模式之工厂 Factory
设计模式之工厂 Factory
23 1
|
2月前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
2月前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
2月前
|
设计模式 Java 关系型数据库
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
|
11月前
|
设计模式
工厂设计模式
工厂设计模式
35 0
|
2月前
|
设计模式 Java Spring
Spring5深入浅出篇:Spring工厂设计模式拓展应用
Spring5深入浅出篇:Spring工厂设计模式拓展应用
|
2月前
|
设计模式 Java Spring
Spring5深入浅出篇:Spring与工厂设计模式简介
Spring5深入浅出篇:Spring与工厂设计模式简介
|
12月前
|
设计模式 算法 前端开发
【大话设计模式】-简单工厂-工厂方法-自动化实现工厂工厂方法!
【大话设计模式】-简单工厂-工厂方法-自动化实现工厂工厂方法!