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

简介: 工厂模式(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();
}
相关文章
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
10天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
37 2
|
5月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
70 1
|
5月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
5月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
5月前
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
83 0
|
7月前
|
设计模式 Java 编译器
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
设计模式——创建型模式(工厂,简单工厂,单例,建造者,原型)
|
6月前
|
设计模式 Java 开发者
工厂设计模式的实现与应用场景分析
工厂设计模式的实现与应用场景分析
|
7月前
|
设计模式 算法 Java
Java中的设计模式:实战案例分享
Java中的设计模式:实战案例分享