设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建。

根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工厂方法模式。

一、普通工厂方法模式:

常见的经典写法如下(以发送邮件和短信为例):

1.定义邮件类和短信类具有的共同接口:

1 interface Sender{
2     
3     public void sender();
4     
5 }

2.定义邮件类和短信类:

复制代码
1 class MailSender implements Sender{
2 
3     @Override
4     public void send() {
5         System.out.println("发送邮件");
6     }
7     
8 }
复制代码
复制代码
1 class SmsSender implements Sender{
2 
3     @Override
4     public void send() {
5         System.out.println("发送短信");
6     }
7     
8 }
复制代码

3.定义工厂类:

复制代码
 1 class SenderFactory {
 2 
 3     public Sender produce(String type) {
 4         if (type.equals("mail")) {
 5             return new MailSender();
 6         } else if (type.equals("sms")) {
 7             return new SmsSender();
 8         } else {
 9             return null;
10         }
11     }
12 
13 }
复制代码

4.测试生成MailSender和SmsSender对象:

复制代码
 1 package com.qqyumidi;
 2 
 3 public class FactoryMethodTest {
 4 
 5     public static void main(String[] args) {
 6         SenderFactory factory = new SenderFactory();
 7         Sender mailSender = factory.produce("mail");
 8         Sender smsSender = factory.produce("sms");
 9     }
10 
11 }
复制代码

 

二、多个工厂方法模式:

将普通工厂模式中的工厂类中创建类的方法从依赖于参数判断改为直接针对每种对象各自定义一个生产方法。

具体代码如下:

复制代码
 1 class SenderFactory {
 2 
 3     public Sender produceMail(){
 4         return new MailSender();
 5     }
 6     
 7     public Sender produceSms(){
 8         return new SmsSender();
 9     }
10 
11 }
复制代码

 

三、静态工厂方法模式:

静态工厂方法模式与前面两种具体的方法定义不同在于方法被定义成静态的,这样可以不通过创建工厂实例就能直接获取到目标类的对象。

复制代码
 1 class SenderFactory {
 2 
 3     public static Sender produceMail(){
 4         return new MailSender();
 5     }
 6     
 7     public static Sender produceSms(){
 8         return new SmsSender();
 9     }
10 
11 }
复制代码

 

对于工厂方法模式,推荐使用第三种写法。

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式

本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3744842.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高新园区到大连计算机学校,大连高新区中心小学

大连市高新区中心小学简介:大连市高新区中心小学始建于2009年9月,是大连高新技术产业园区筹建的第一所直属公办学校。学校现拥有2000多名学生,87名教职员工。学校确定了“办诗韵教育,让每个孩子都幸福的教育理念”,通过…

0限流电阻 stm32_上/下拉电阻

除了前一节讨论的拉电阻基本使用方法外,上拉电阻也可以提升高电平的电压阈值,以便于前后级信号相匹配,比如,TTL逻辑电平驱动CMOS逻辑电平时,我们通常会添加一个上拉电阻R1,如下图所示:But Why&a…

网段和子网的区别_电焊石笼网与普通石笼网区别

对于石笼网,每个人都会想到在河中,桥梁附近和大坝上充满石头的笼子结构。今天,我们谈论的是石笼网的一种电焊石笼网,它也是一种常见的石笼网,也被称为六边形石笼网。其功能与石笼网相同,但用法与普通石笼网…

jquery $(document).ready() 与window.onload的区别

转载博客:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的。 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后…

小学三年级上册计算机计划,小学三年级数学上册教学计划

小学三年级数学上册教学计划一、班级情况分析这一学期我继续担任三年级数学教学工作,本班现有学生9人,其中男生3人,女生6人。三年级学生已经有两年的数学学习经历,对一些基础性的数学知识有了初步的认识。学生已经比较习惯于新教材…

centos7查看当前cpu运行模式_杂集:centos7中设置服务开机自启的两种方法,欢迎补充...

前言:在日常使用linux系统过程中,安装服务后系统不会自动启动服务的。就算手动启动了服务,只是当前生效,一旦服务器重启后,系统不会自动启动这些服务。如果每次重启服务器都要自己手动启动这些服务,一台还阔…

Sort HDU5884(二分+多叉哈夫曼树)

HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k。 思路:还是太单纯,看完题目一直以为要用归并排…

Linux系统(五)负载均衡LVS集群之DR模式

序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图。LVS/NAT模式如下图: LVS/IP隧道模式,如下图: LVS/…

Redux API之applyMiddleware

applyMiddleware(...middlewares) 使用包含自定义功能的 middleware 来扩展 Redux 是一种推荐的方式。Middleware 可以让你包装 store 的dispatch 方法来达到你想要的目的。同时, middleware 还拥有“可组合”这一关键特性。多个 middleware 可以被组合到一起使用&a…

计算机2018创业方向,推荐2018年创业的方向

原标题:推荐2018年创业的方向1 新电商传统的零售业收到互联网电商的重冲击,从而进行线上线下的结合是必然的趋势,新零售,新电商,是几千万零售企业成功转型的必然之路,学习一套全面的新电商转型的方法&#…

包无法安装_详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel

详细教程 | 安装Python编程环境以及使用OpenpyXl操作Excel注意:下列教程为 Windows7 64位;Windows 10有部分步骤有差异,请参考使用!01 下载Python程序安装包首先前往Python官网 www.python.org,进入官网点击 Downloads,然后点击 W…

request重定向_golang不想http自动处理重定向的解决方案

前言有时候发送http请求不想让库自动帮忙处理重定向,库里面默认的是会把所有重定向都完成一遍,结果就是最后一个没有重定向的请求的结果。因此需要一种方案直接获取首次访问的结果,不走重定向。go的http库里面是使用如下代码检查重定向的&…

float foo=42e1为什么错_为什么重写了equals()也要重写hashCode()

小Hub领读:虽然是很基础的一篇文章,但是对于equals、hashcode两个方法,相信很多人都与其中的规则不熟悉,来跟着小Hub花个8分钟回顾一下!作者:不学无数的程序员https://my.oschina.net/u/4030990/blog/31341…

ssh客户端_一款基于TAS框架的SSH客户端蠕虫

TEA是一款基于TAS框架的SSH客户端蠕虫,从本质上说,它是一个仿冒的SSH客户端,它能够修改tty输入/输出来实现任意命令执行,或通过SSH连接来上传自身以实现渗透感染。为了实现该工具的正常功能,远程主机需要满足以下条件&…

分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】

我们在使用电脑的时候,当电脑显卡出现问题导致屏幕画面不清晰时,可以使用win7系统自带nvidia控制面板,它能够对显卡进行设置,提升显卡功能,不过很多电脑用户点击nvidia控制面板时却提示nvidia显示设置不可用&#xff0…

day3-文件操作之基本操作

一、文件的基本操作 文件内容: Somehow, it seems the love I knew was always the most destructive kind 不知为何,我经历的爱情总是最具毁灭性的的那种 Yesterday when I was young 昨日当我年少轻狂1、read() 当read()函数中传入整数(int)参数&#…

spad 探测器_从光到光子—“单光子”探测器

光电探测器光电探测器是指在光辐射作用下将其非传导电荷变为传导电荷的一类器件。在电子学中,二极管是一种具有不对称传输特性的双端电子元件,在一个方向上对电流具有低(理想为零)电阻,在另一个方向上具有高(理想为无限)电阻。最常见的类型如…

天地图专题五:在天地图上绘制电子区域并保存数据

版权声明:本文为博主原创文章,转载请注明出处。 上一文章讲了如何在天地图上显示坐标轨迹。 本文介绍如何在天地图上绘制电子区域(电子范围或电子栅栏),并且,我们要将我们绘制的电子区域的坐标数据保存到数…

微信和支付宝的服务器在哪里,手机恢复出厂设置,里面支付宝与微信怎么办?原来数据在这里...

当手机使用一段时间之后,因为硬件落后会出现卡顿、内存不足等情况,这个时候提高手机速度最直接的一个办法就是恢复出厂设置,虽然不能从根源上解决问题,但是还是可以凑合个半年时间的。那么这个时候就出现一个问题,手机…

mysql insert 不需要日志_MySQL数据库性能优化(1)「转」

1、MySQL概述从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案。关系型数据库的选型将以创业公司、互联网行业使用最广泛的MySQL数据为目标,但是MySQL的安装过程和基本使用方法等知识并不在我们讨论的范围内。后续几篇文章我们首先…