在阎宏博士的《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. leetcode 戳气球

    有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[ ...

  2. 855E

    数位DP 昨天的B题,excited 又学习了一下数位dp... 数位dp要考虑几个比较重要的东西:1.前导0,2.天际线,3.记忆化的条件,4.细节 经常数位dp会问我们l->r区间中满足某某 ...

  3. 【WIP】Objective-C Foundation框架的主要对象

    创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类  可变与不变的对象  一览  种类  不变类  可变类  数组  NSA ...

  4. js字符串去除连续或全部重复字符

    js字符串去除连续重复字符 ()和\number 配合使用表示重复正则第number个括号内匹配到的内容,如:(\d)\1表示重复第一个匹配块(\d)即等价于如果(\d)匹配到a,则表达式为aa 相应 ...

  5. python pep8 命令规范

    命名规范:总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格.1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母.2 模块命名尽量短小,使用全部小写的方式,可以使用下划线. ...

  6. bzoj 4481: [Jsoi2015]非诚勿扰【期望+树状数组】

    首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 \[ p*(1-p)^{i-1}+p*(1-p)^{i-1+n}+p*(1-p)^{i-1+n}+- \] \[ ...

  7. Ocelot(八)- Ocelot不支持的几个方面

    不支持 Ocelot不支持的几个方面 Chunked Encoding - Ocelot将始终获取正文大小并返回Content-Length标头.很抱歉,如果这对您的用例不起作用! 转发主机标头 - ...

  8. Golang bash脚本自动创建一个go工程

    原作者的代码里面,存在智能引号问题,所以他的代码并不能正常运行: 这个是我微调后的版本. 代码如下: #!/bin/bash #————————————– # Module : mk_go_pro.s ...

  9. 《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存

    在应用程序中使用虚拟内存 Windows提供了以下三种机制对内存进行操控: 一:虚拟内存.最适合来管理大型对象数据或大型结构数组. 二:内存映射文件.最适合用来管理大型数据流,以及在同一机 器上运行的 ...

  10. hdu 5335 Walk Out (搜索)

    题目链接: hdu 5335 Walk Out 题目描述: 有一个n*m由0 or 1组成的矩形,探险家要从(1,1)走到(n, m),可以向上下左右四个方向走,但是探险家就是不走寻常路,他想让他所走 ...