#设计模式
简单工厂模式,也叫作静态工厂模式
#解释
是类的创建模式,是由一个工厂对象决定创建出哪一种产品类的实例
#场景举例
应用系统需要支持多种登录方式,比如口令登录和域登录。那么我们可以创建一个所有登录方式都适用的接口,让其他具体实现类实现
#具体流程
当客户端发起登录请求-->请求交给服务端的Servlet-->Servlet根据客户端传递的loginType调用工厂类LoginManager的factory()方法-->factory()方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)并返回-->登录验证类调用方法verify()来验证用户名密码或者域名是否正确
#优点
模式的核心是工厂类,这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者
#缺点
这个工厂类集中了所有的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。类中代码会过长,容易出错,出错了整个程序都会受影响,波及范围广。
代码如下:
Login.java
/******************************************************************
* 文件名称: csdn26.factory.Login
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 13:53
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factory;
/**
* <p>Title:简单工厂模式 </p>
* <p>Description: 建立一个各种登录方式都适用的接口</p>
*
* @Author Lucky
* @Date 2021/8/6 13:53
* @Version 1.0
*/
public interface Login {
boolean verify(String userId, String pwd, String url);
}
DomainLogin.java
/******************************************************************
* 文件名称: csdn26.factory.DomainLogin
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 14:16
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factory;
/**
* <p>Title: 域验证</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 14:16
* @Version 1.0
*/
public class DomainLogin implements Login{
@Override
public boolean verify(String userId, String pwd, String url) {
System.out.println("域验证结束");
return true;
}
}
PwdLogin.java
/******************************************************************
* 文件名称: csdn26.factory.PwdLogin
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 14:17
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factory;
/**
* <p>Title: 用户名密码验证</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 14:17
* @Version 1.0
*/
public class PwdLogin implements Login{
@Override
public boolean verify(String userId, String pwd, String url) {
System.out.println("密码验证结束");
return true;
}
}
Factory.java
/******************************************************************
* 文件名称: csdn26.factory.Factory
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 14:21
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factory;
/**
* <p>Title: 工厂类</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 14:21
* @Version 1.0
*/
public class Factory {
public Login getFactory(String type){
if("DOMAIN".equals(type)){
Login login = new DomainLogin();
System.out.println("域验证开始");
return login;
}else if("PWD".equals(type)){
Login login = new PwdLogin();
System.out.println("密码验证开始");
return login;
}else{
throw new RuntimeException("不存在该验证类型");
}
}
}
Client.java
/******************************************************************
* 文件名称: csdn26.factory.Client
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 14:25
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factory;
import org.junit.Test;
/**
* <p>Title: 客户端测试类</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 14:25
* @Version 1.0
*/
public class Client {
@Test
public void test(){
String type = "PWD";
String userId = "1";
String pwd = "1";
String url = "login.jsp";
Factory factory = new Factory();
factory.getFactory(type).verify(userId, pwd, url);
type ="DOMAIN";
factory.getFactory(type).verify(userId, pwd, type);
}
}