当前位置: 首页 > news >正文

【大话设计模式】工厂方法模式

【工厂方法模式】

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

 

【简单工厂 与 工厂方法 比较】

【简单工厂的特点】简单工厂的工厂类中包含,包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

以计算器为例,在客户端只要把‘+’传给工厂,工厂就给出了相应的实例,客户端只要做运算即可。

【简单工厂的缺陷】但是,如果要增加一个功能,就需要在工厂类的方法里加分支条件,修改原有的类。

这就等于说,不但对拓展开放,而且对修改也开放,违背了开放-封闭原则。

【使用工厂方法】根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂实现这个接口。

这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。

如果要增加新功能,只需要增加此功能的运算类和相应的工厂类。这样就符合开发-封闭原则。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂,所以工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。

【工厂方法的优点】工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但是增加了额外的开发量。

【简单工厂模式】实现计算类

class OperationFactory{
  public static Operation createOperate(String operate){
      Operation oper = null;
      swtich(operate){
        case "+":
           oper = new OperationAdd();
           break;
        case "-":
           oper = new OperationSub();
           break;
        case "*": 
           oper = new OperationMul();
           break;
        case "/":
           oper = new OperationDiv();
           break;
      }
      return oper;
  }

}
Operation oper;
oper = OperationFactory.createOperate("+");

【工厂模式实现计算类】

public interface Ifactory{
  Operation CreateOperation();
}

public class AddFactory implements IFactory{
  @Override 
  public Operation CreateOperation(){
    return new OperationAdd();
  }
}
public class SubFactory implements IFactory{
  @Override 
  public Operation CreateOperation(){
    return new OperatioSub();
  }
}
public class MulFactory implements IFactory{
  @Override 
  public Operation CreateOperaton(){
    return new OperationMul();
  } 
}
public class DivFactory implements IFactory{
 @Override
 public OPeration CreateOperation(){
   return new OperationDiv();
 }
}
IFactory operFactory = new AddFactory();
OPeration oper = operFactory.CreateOperation();

相关文章:

  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • DSPE-PEG-iRGD,iRGD-PEG-DSPE,磷脂-聚乙二醇-靶向肽iRGD,一种磷脂PEG肽
  • 自助商业智能平台 HK-Visokio Omniscope 详解!
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • java优先级队列PriorityQueue
  • 537、RabbitMQ详细入门教程系列 -【消费者Consumer(一)】 2022.08.31
  • wxpython分页
  • Java输入/输出之RandomAccessFile的功能和用法
  • RNNGNULSTM与PyTorch
  • Python升级之路( Lv15 ) 并发编程三剑客: 进程, 线程与协程
  • 南大通用GBase 8a MPP Cluster开发接口简介
  • IntelliJ IDEA 插件推荐
  • Rt-Thread 启动流程与组件初始化
  • CentOS-7-x86_64 iso镜像的安装(Linux操作系统)
  • Parcel配置public静态文件目录
  • 深入了解以太坊
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • AHK 中 = 和 == 等比较运算符的用法
  • es6要点
  • ES学习笔记(12)--Symbol
  • js数组之filter
  • leetcode98. Validate Binary Search Tree
  • Markdown 语法简单说明
  • mysql innodb 索引使用指南
  • Nacos系列:Nacos的Java SDK使用
  • SOFAMosn配置模型
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue ES6 Jade Scss Webpack Gulp
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 工作中总结前端开发流程--vue项目
  • 面试题:给你个id,去拿到name,多叉树遍历
  • Java数据解析之JSON
  • 如何正确理解,内页权重高于首页?
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • $.ajax()方法详解
  • (4)事件处理——(7)简单事件(Simple events)
  • (C#)获取字符编码的类
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (九)c52学习之旅-定时器
  • (一)Java算法:二分查找
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)大型网站的系统架构
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***详解账号泄露:全球约1亿用户已泄露
  • ./configure、make、make install 命令
  • .net 流——流的类型体系简单介绍
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6 命令行启动及发布单个Exe文件
  • .NET分布式缓存Memcached从入门到实战
  • .NET设计模式(2):单件模式(Singleton Pattern)