当前位置:网站首页>详解工厂方法
详解工厂方法
2022-06-09 13:45:00 【Floral Sea】
详细讲解工厂方法
为了更好的说明工厂方法,我们先不给出刻板的语言,我们根据实际的例子来看
假如我们要构建一个计算器,定义加法、乘法、除法等的各种操作,考虑到封装的思想,我们可能会构造如同加法类,乘法类,除法类,减法类等的一系列类如下:
- Class OperationAdd
- Class OperationMinus
- Class OperationMul
- Class OperationDiv
当我们想要增加新的功能的时候的时候我们就增加相应的类的时候即可,但是这样带来一个问题,当我们想要使用特定的类中的方法时,如果不是静态类的话我们都需要先实例化一个对象,比如我们要做乘除法等之类的连续操作,那么我们接下来的行为可能是这样的:Class mul = new OperationMul()Class div = new OperationDiv()...
们可能需要最很多重复的操作,我们的代码可能会变得很臃肿。实际上这时我们要考虑的是如何去实例化对象的问题,也就是到底要实例化谁,将来会不会增加实例化的对象,比如我们还想增加新的功能应该怎么办呢?简单工厂方法正好为我们提供了这样的解决方法:
public class OperationFactory
{
public static Operation createOperate(String operate){
Operation oper = null;
switch(opertate){
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
在这里Operation是一个计算类,但是我们通过Switch case在实例化的时候实现了不同的子类,可以认为operation在这里实际上是一种声明,我们的Operation[a-z]都是operation的子类,这里运用了多态的性质。
eg:多态的解释
Animal obj = new Horse();
这里我们假设Horse继承了Animal这个类,所以此处的Animal只是一种声明,在运行时这个对象的实际情况是由我们后面new的对象horse决定,参数化多态指的是一个类型的名字可以代表多个类型。
看到了吗?我们通过这样的设计方式,只需要输入运算的符号,工厂就能实例化出不同的对象,通过多态返回父类的方法同样实现了我们想要的结果。
接下来对于这样的方法思考以下两个问题:
1.如果我们想改变加法的行为,该怎么办呢?
答:只需要更改OperationAdd类即可
2.如果我们想要添加运算方式该怎么办呢,比如加上开方的运算
答:添加相应的运算子类,并在switch case的表项中添加相应的分支
总结:
当用户不知道要创建哪个具体类的实例,或者不想在用户代码中指明要创建的实例时我们通常使用工厂方法。
**工厂方法的实质是:**让子类来决定实例化哪一个类,从而使一个类的实例化延迟到子类。
看到这里相信大家对这个简单的工厂方法一定有一定的理解了,大家如果感兴趣的话可以看下**《大话设计模式》**中的抽象工厂方法,相信你会了解到工厂方法的设计精妙之处和相应的弊端。
这篇博客到这里就结束了,感谢你的阅读!
边栏推荐
- 【Leetcode刷题记录】分类整理
- FFMPEG对HLS切片的支持
- Nerf neural radiation field eccv2020
- Introduction to assembly language - instruction and addressing
- 4427 node sum in tree (greedy)
- Machine learning basics memorandum
- #导入Word文档图片# VM虚拟机网络设置
- Is it reliable and safe to open an account for external futures?
- 入职腾讯外包一个月,我离职了
- TCP/IP协议(1)
猜你喜欢

Machine learning basics memorandum

Google 安装印象笔记剪藏插件

Import word document picture VM virtual machine network settings

51 MCU timer 0 is used as time reference and delay function reference

代码实现WordPress编写文章可以调整字体字号

Best practices for WSL installation

为什么 SQL 语句使用了索引,但却还是慢查询?

面试了一位7年软件测试工作者:成也“7”年,败也“7”年

PhD Debate | 自监督学习在推荐系统中的应用

【数据库】期末复习:SQL语句、范式的定义和判断、ER图转关系模式
随机推荐
工作到一半电脑重启
QUIC必看
I haven't published a thesis for 5 years, and I want to give up my doctoral degree? Ten thousand words self narration of the doctoral director of the University of science and technology of China: he
我为InfoQ写作社区定制一款机械键盘庆生
FFMPEG对HLS切片的支持
The Embassy in the United States reminds Chinese citizens in the United States to pay attention to summer travel safety
Introduction to erc721 non homogenous token (NFT)
MySQL数据库(25):外键 foreing key
HCIA datacom experiment IPv4 addressing and IPv4 routing basic experiment
为什么 SQL 语句使用了索引,但却还是慢查询?
多元时间序列分析 —— 因果检验
硬件基础——模拟电路
AI 考生挑战高考作文,平均 1 秒生成 1 篇,水平超 75% 考生
UniswapV2周边合约学习(六)-- ExampleOracleSimple.sol
TCP(滑动窗口,流量控制)
Interviewed a software tester for 7 years: 7 years for success and 7 years for failure
[tgcalls] trace the call debugging managers to the upper layer of 3:ticket:: candidate >
苏涛:对抗样本技术在互联网安全领域的应用
颠覆认知!数据增强、正则化可导致不易察觉的灾难?
输入一行字符(最多80个),从第location个位置开始,截取number个字符并将其输出。