zoukankan      html  css  js  c++  java
  • JAVA基础——设计模式之简单工厂模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

    举例说明适用场景:

      假设应用系统需要多种登录方式:口令认证(通过数据库验证用户)、域认证(通过微软域验证用户)。建立一个支持多种登录方式的接口,见下图:

      

    1 public interface Login {
    2     //登录验证
    3     public boolean verify(String name , String password);
    4 }
    复制代码
     1 public class DomainLogin implements Login {
     2 
     3     @Override
     4     public boolean verify(String name, String password) {
     5         // TODO Auto-generated method stub
     6         /**
     7          * 业务逻辑
     8          */
     9         return true;
    10     }
    11 
    12 }
    复制代码
    复制代码
     1 public class PasswordLogin implements Login {
     2 
     3     @Override
     4     public boolean verify(String name, String password) {
     5         // TODO Auto-generated method stub
     6         /**
     7          * 业务逻辑
     8          */
     9         return true;
    10     }
    11 
    12 }
    复制代码

      工厂类LoginManager根据不同要求创建出不同的登录对象并返回。而如果遇到非法要求,会返回一个Runtime异常。

    复制代码
     1 public class LoginManager {
     2     public static Login factory(String type){
     3         if(type.equals("password")){
     4             
     5             return new PasswordLogin();
     6             
     7         }else if(type.equals("passcode")){
     8             
     9             return new DomainLogin();
    10             
    11         }else{
    12             /**
    13              * 这里抛出一个自定义异常会更恰当
    14              */
    15             throw new RuntimeException("没有找到登录类型");
    16         }
    17     }
    18 }
    复制代码

      

      测试类:

    复制代码
     1 public class Test {
     2     public static void main(String[] args) {
     3         // TODO Auto-generated method stub
     4         String loginType = "password";
     5         String name = "name";
     6         String password = "password";
     7         Login login = LoginManager.factory(loginType);
     8         boolean bool = login.verify(name, password);
     9         if (bool) {
    10             /**
    11              * 业务逻辑
    12              */
    13         } else {
    14             /**
    15              * 业务逻辑
    16              */
    17         }
    18     }
    19 }
    复制代码

      简单工厂模式的结构见下图:

      

      把上面的Test当做一个Servlet时,客户端发起登录请求—>请求交给服务端Servlet—>Servlet根据客户端传递的loginType调用工厂类LoginManager的factory方法—>factory方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)的对象并返回—>登录验证对象调用verify方法验证用户名和密码是否正确。

      

      如果不使用简单工厂模式则验证登录Servlet代码如下(假设Test为一个Servlet,变量loginType、name、password表示从客户端传递过来的参数):

    复制代码
     1 public class Test {
     2     public static void main(String[] args) {
     3         // TODO Auto-generated method stub
     4         
     5         String loginType = "password";
     6         String name = "name";
     7         String password = "password";
     8         //处理口令认证
     9         if(loginType.equals("password")){
    10             PasswordLogin passwordLogin = new PasswordLogin();
    11             boolean bool = passwordLogin.verify(name, password);
    12             if (bool) {
    13                 /**
    14                  * 业务逻辑
    15                  */
    16             } else {
    17                 /**
    18                  * 业务逻辑
    19                  */
    20             }
    21         }
    22         //处理域认证
    23         else if(loginType.equals("passcode")){
    24             DomainLogin domainLogin = new DomainLogin();
    25             boolean bool = domainLogin.verify(name, password);
    26             if (bool) {
    27                 /**
    28                  * 业务逻辑
    29                  */
    30             } else {
    31                 /**
    32                  * 业务逻辑
    33                  */
    34             }    
    35         }else{
    36             /**
    37              * 业务逻辑
    38              */
    39         }
    40     }
    41 }
    复制代码

      与使用简单工厂模式的代码相比,上面的代码质量很差。

      

      简单工厂模式的优点

      工厂类有创建逻辑,免除调用者直接创建对象的责任。

      简单工厂模式的缺点

      工厂类集中了大量的创建逻辑,逻辑判断严重影响整个系统。

  • 相关阅读:
    操作系统知识点_用户编程接口
    操作系统知识点_内存管理
    操作系统知识点_进程管理
    LintCode 二叉树的后序遍历
    LintCode 二叉树的最大深度
    LintCode 二叉树的中序遍历
    LintCode 二叉树的前序遍历
    LintCode 删除排序链表中的重复元素
    Lintcode 二分查找
    lintcode 空格替换
  • 原文地址:https://www.cnblogs.com/huan-guo/p/8569091.html
Copyright © 2011-2022 走看看