工厂模式

工厂模式


概述

  • 分类
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
  • 作用
    • 将对象的创建与使用分离

简单工厂模式

  • 概述:提供工厂类用于对象创建,将对象的创建与使用分离1
  • 组成:
    • creator:工厂角色,主要职责是根据需求创建具体产品对象
    • productor:抽象角色,产品对象的抽象父类
    • concrete-productor:具体产品角色
  • 优势:
    • 业务分离:将对象的创建(生产者)与对象使用(消费者)分离
    • 对象黑盒:调用方无需关注生成的具体的产品角色
  • 劣势:
    • 将对象创建工作放置在一个类中,扩展性受到限制,增加新的产品类型必然要修改工程类,违反开闭原则
  • 示例2
    • 功能描述:两个数的加减乘除运算及结果输出

    • 抽象角色

      /**
       * 基础运算对象
       * 1.定义运算参数
       * 2.定义抽象方法
       */
      public abstract class BaseOperation {
      
          private Integer numberA ;
      
          private Integer numberB ;
      
          /**
           * 具体运算规则交由子类实现
           */
          public abstract void operation();
      
          public Integer getNumberA() {
              return numberA;
          }
      
          public void setNumberA(Integer numberA) {
              this.numberA = numberA;
          }
      
          public Integer getNumberB() {
              return numberB;
          }
      
          public void setNumberB(Integer numberB) {
              this.numberB = numberB;
          }
      }
      
      
    • 具体角色

      
      /**
       * 加法运算
       */
      public class AddOperation extends BaseOperation {
      
          @Override
          public void operation() {
              Integer result = getNumberA() + getNumberB() ;
              System.out.println(result);
          }
      }
      
      
      /**
       * 减法运算
       */
      public class SubOperation extends BaseOperation {
          @Override
          public void operation() {
              Integer result = getNumberA() - getNumberB() ;
              System.out.println(result);
          }
      }
      
      /**
       * 乘法运算
       */
      public class MulOperation extends BaseOperation {
      
          @Override
          public void operation() {
              Integer result = getNumberA() * getNumberB();
              System.out.println(result);
          }
      }
      
      
      /**
       * 除法运算
       */
      public class DivOperation extends BaseOperation {
      
          @Override
          public void operation() {
              if(getNumberB() != 0){
                  System.out.println(getNumberA() / getNumberB());
              }
          }
      }
      
    • 工厂角色

      
      /**
       * 简单工厂模式工厂类
       * 负责根据业务需求创建具体的产品角色
       */
      public class SimpleFactoryModelFactory {
      
          /**
           * 适用场景:
           * 业务逻辑稳定且较长时间内不会变更
           *
           * 模式劣势:
           * 产品角色扩充需要修改工厂类,违反开闭原则
           *
           * @param operationFlag
           * @return
           */
          public static BaseOperation createOperation(char operationFlag){
              /**
               * 此处极容易出错,需要调用方与提供方严格约束入参类型及内容
               */
              switch (operationFlag){
                  case '+' : return new AddOperation();
                  case '-' : return new SubOperation();
                  case '*' : return new MulOperation();
                  case '/' : return new DivOperation();
                  default:return new AddOperation();
              }
          }
      }
      
      
    • 对象使用

      /**
       * 简单工厂方法测试类
       */
      public class SimpleFactoryModelTest {
      
          public static void main(String[] args) {
      
              BaseOperation operation = SimpleFactoryModelFactory.createOperation('+');
              operation.setNumberA(1);
              operation.setNumberB(1);
              operation.operation();// 2
          }
      }
      

工厂方法模式3

  • 概述:简单工厂模式的延伸,弥补简单工厂模式的不足
  • 组成:
    • Creator:工厂角色
    • Productor:抽象角色
    • Concrete-productor:具体产品角色
  • 优势:相比于简单工厂模式,避免了因传入字符错误而导致模型创建失败
  • 劣势:新增新的模型依然需要修改工厂方法,违反开闭原则
  • 示例:
    • 工厂方法模式

      /**
       * 工厂方法模式
       * 与简单工厂模式相比,可以避免因传入字符不匹配而导致对象创建错误
       */
      public class FactoryMethodModelFactory {
      
          public static BaseOperation createAddOperation(){
              return new AddOperation();
          }
      
          public static BaseOperation createSubOperation(){
              return new SubOperation();
          }
      
          public static BaseOperation createMulOperation(){
              return new MulOperation();
          }
      
          public static BaseOperation createDivOperation(){
              return new DivOperation();
          }
      }
      
    • 工厂方法模式单元测试

      /**
       * 工厂方法模式测试类
       */
      public class FactoryMethodModelTest {
      
          public static void main(String[] args) {
              BaseOperation baseOperation = FactoryMethodModelFactory.createAddOperation();
              baseOperation.setNumberA(1);
              baseOperation.setNumberB(2);
              baseOperation.operation();
          }
      }
      
      

抽象工厂模式4

  • 概述:抽象工厂方法是工厂方法模式的延伸,它提供了功能更为强大的工厂类并且具备较好的可扩展性
  • 组成:
    • abstract-creator:抽象工厂角色,定义需要子类继承实现的方法
    • productor:抽象角色
    • concrete-productor:具体产品角色
    • concrete-creator:具体工厂角色,根据需求定义多个子类
  • 优势:方便增加同类模型对象,扩展性强
  • 劣势:产品模型结构扩充困难,需要从抽象对象开始进行修改
  • 示例
    • 抽象工厂
      /**
       * 抽象工厂模式
       */
      public interface OperationFactory {
          BaseOperation createOperation();
      }
      
    • 工厂实例
      /**
       * 加法操作工厂
       */
      public class AddOperationFactory implements OperationFactory {
      
          public BaseOperation createOperation() {
              return new AddOperation();
          }
      }
      
    • 抽象工程单元测试类
      /**
       * 抽象工厂模式
       */
      public class AbstractFactoryModelTest {
      
          public static void main(String[] args) {
      
              OperationFactory operationFactory = new AddOperationFactory();
              BaseOperation operation = operationFactory.createOperation();
              operation.setNumberB(1);
              operation.setNumberA(2);
              operation.operation();
          }
      }
      

  1. 24种设计模式优缺点及适用场景#简单工厂模式 ↩︎

  2. 设计模式之工厂模式 ↩︎

  3. 24种设计模式优缺点及适用场景#工厂方法模式 ↩︎

  4. 24种设计模式优缺点及适用场景#抽象工厂模式 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值