在阎宏博士的《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 }

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

  

  简单工厂模式的优点

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

  简单工厂模式的缺点

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

JAVA基础——设计模式之简单工厂模式的更多相关文章

  1. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  2. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  3. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...

  4. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  5. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  6. Java 设计模式01 - 简单工厂模式

    先要学习设计模式之前的先看看一些基础 UML类图简单说明 可以先看看我的这篇博客: UML类图简单说明,学习编程思路的必会技能 接下来才是重点,开始我们的旅程吧. 一.UML类图展示 我们要用简单工厂 ...

  7. (1)java设计模式之简单工厂模式

    一:简单工厂模式的优点          --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...

  8. Java设计模式(1)——简单工厂模式

    简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 一.模式中包含的角色及其职责 1.工厂(Creator)角色 简单 ...

  9. Java 设计模式之 简单工厂模式(静态工厂方法模式)

    简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...

随机推荐

  1. python-----群发图片

    使用wxpy库给3个人群发同一张图片 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/2/22 15:25 # @Author ...

  2. (8)css表格

    用css设置表格样式 *<table></table> 标签定义 HTML 表格. * tr 元素定义表格的行:th 元素定义表格的表头:td 元素定义表格中的单元格:capt ...

  3. 我的周记6——"不破楼兰誓不还“

    周6 2019-06-13  天气:雨 这张照片是我那天中午回家的时候拍的,下着中雨.这是谁的孩子,又是谁的妈妈.看到这样的场景心里还是蛮有触动的, 因为我现在是离家千里的孩子,思念着故乡也想念着亲人 ...

  4. QB学堂济南游记

    七天很快就过去了,今天的测试意味着集训也将结束.回首七天来,与许多dalao同处一室,见识到了各种厉害的老师.厉害的算法.厉害的数据结构. 前两天jzh与yl老师讲课的时候还是全程在线,然而讲到数据结 ...

  5. 关于数学函数中的abs——————————————杭电2057——————————————————————————

    数学函数中的abs当你用abs之后括号之中的数字就转换成了int格式.可能会丢失一些数据造成误差而且还会有,    警告: #include<stdio.h> #include<ma ...

  6. Canny检测理解和Matlab实现

    图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值. 1.Canny边缘检测的基本特征 (1) ...

  7. django中实现websocket

    一.Websockets介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...

  8. ACM_棋棋棋棋棋(规律题)

    棋棋棋棋棋 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在遥远的K次元空间,一年一度的GDUFE-GAME又开始了.每年的GD ...

  9. D. Artsem and Saunders 数学题

    http://codeforces.com/contest/765/problem/D 这题的化简,不能乱带入,因为复合函数的带入,往往要严格根据他们的定义域的 题目要求出下面两个函数 g[h(x)] ...

  10. vue报错-Error: Cannot find module '@babel/core'

    vue之webpack实战的时候遇到报错,Error: Cannot find module '@babel/core' 这报错,我百度了很久,后来发现报错里面有提示,发现是我的 babel-load ...