博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结篇系列:工厂方法模式(Factory Method)
阅读量:6249 次
发布时间:2019-06-22

本文共 1930 字,大约阅读时间需要 6 分钟。

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

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

一、普通工厂方法模式:

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

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

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

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

复制代码
1 class MailSender implements Sender{2 3     @Override4     public void send() {5         System.out.println("发送邮件");6     }7     8 }
复制代码
复制代码
1 class SmsSender implements Sender{2 3     @Override4     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,如需转载请自行联系原作者
你可能感兴趣的文章
华为防火墙中的VGMP/VRRP/HRP
查看>>
Java程序员从笨鸟到菜鸟之(八十二)细谈Spring(十一)深入理解spring+struts2整合(附源码)...
查看>>
使普通的powershell 都带有github的环境
查看>>
关于独立CA的模板
查看>>
Datatables 1.10.x与1.9.x参数名对照表
查看>>
通过进程pid找程序路径
查看>>
System Center 2012R2之SCVMM高可用部署
查看>>
工厂模式
查看>>
redis 命令行批量设置过期时间
查看>>
Windows 7/XP系统在局域网文件共享设置方法
查看>>
apache traffic server 缓存服务器快速部署
查看>>
选择Java还是.NET
查看>>
C语言删除字符串中的指定字符,字符串连接
查看>>
小功能
查看>>
我的友情链接
查看>>
OPEN CASCADE BSpline Curve Interpolation
查看>>
Centos 6.5 安装MySQL
查看>>
基于Openssh实现双机互信
查看>>
vSFTP(配置多用户文件共享)
查看>>
Drupal常用开发工具(一)——Devel模块
查看>>