java设计模式之简单工厂模式

简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。

一、普通简单工厂

案例:用户忘记密码,需要找回密码,可通过选择手机或邮箱接收验证码来修改密码。

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("未知的消息通道类型");
		}
	}
	
}


推荐教程

Java设计模式

创建模式、结构模式、行为模式

Maven教程

Maven是一个项目管理和构建工具

Lucene教程

Lucene是一个开源的基于Java的搜索库

JUnit教程

JUnit是Java编程语言的单元测试框架

Java算法

排序、二叉树、红黑树

Log4j教程

log4j是一种用Java编写的可靠,快速和灵活的日志框架(API)

StringBoot教程

StringBoot实战操作演练

mybatis文档手册

Mybatis基础语法、实例讲解

SpringCloud教程

服务发现、断路器、智能路由

Guava教程

Guava是开源的Java工具库

Elasticsearch教程

一款强大的搜索引擎