简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。
一、普通简单工厂
案例:用户忘记密码,需要找回密码,可通过选择手机或邮箱接收验证码来修改密码。
1.1 定义消息发送接口
package com.ityuan.simplefactory; public interface Sender { void send(String message); }
1.2 实现短信发送实例
package com.ityuan.simplefactory; public class SmsSender implements Sender { @Override public void send(String message) { System.out.println("短信通道发送:"+message); } }
1.3 实现邮箱发送实例
package com.ityuan.simplefactory; public class MailSender implements Sender { @Override public void send(String message) { System.out.println("邮件通道发送:"+message); } }
1.4 实现简单工厂并测试发送效果
package com.ityuan.simplefactory; public class SenderFactory { public static Sender create(int type) { if (type == 0) { // 发送短信 return new SmsSender(); } else { // 发送邮件 return new MailSender(); } } public static void main(String[] args) { // 简单工厂测试 SenderFactory.create(0).send("您的验证码是:123456"); SenderFactory.create(1).send("您的验证码是:123456"); } }
1.5 测试结果
短信通道发送:您的验证码是:123456 邮件通道发送:您的验证码是:123456
二、多方法简单工厂(不推荐)
代码实例参考上述的普通简单工厂,这里只提供多方法简单工厂类的实现,如下
package com.ityuan.simplefactory; /** * 工厂通过方法来区分生成不同对象 */ public class SenderFactory { public Sender createMail() { return new MailSender(); } public Sender createSms() { return new SmsSender(); } public static void main(String[] args) { // 多方法简单工厂测试 new SenderFactory().createMail().send("您的验证码是:123456"); new SenderFactory().createSms().send("您的验证码是:123456"); } }
三、静态方法简单工厂
静态方法简单工厂与多方法简单工厂的区别是:将工厂方法全部用static进行修饰。代码实例如下:
package com.ityuan.simplefactory; /** * 包含多个静态方法 */ public class SenderFactory { public static Sender createMail() { return new MailSender(); } public static Sender createSms() { return new SmsSender(); } public static void main(String[] args) { // 静态方法简单工厂测试 SenderFactory.createMail().send("您的验证码是:123456"); SenderFactory.createSms().send("您的验证码是:123456"); } }
在大型项目实战过程中,我们通常采用普通简单工厂模式,例如将消息通道类型type与实现对象实例通过map对象关联(可以考虑spring.xml的map配置),代码示例如下:
<bean id="sendFactory" class="com.ityuan.simplefactory.SendFactory"> <property name="sendMap"> <map> <entry key="0" value-ref="mailSender"></entry> <entry key="1" value-ref="smsSender"></entry> </map> </property> </bean>
代码应用示例如图,这样设计后以后新增通道只需要实现通道和配置xml即可。
package com.ityuan.simplefactory; import java.util.Map; /** * 简单工厂 */ public class SenderFactory { private Map<Integer,Sender> sendMap; public Sender create(int type) { Sender sender = sendMap.get(type); if (sender != null) { return sender; } else { throw new RuntimeException("未知的消息通道类型"); } } }