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 }

与使用简单工厂模式的代码相比,上面的代码质量很差。
简单工厂模式的优点
工厂类有创建逻辑,免除调用者直接创建对象的责任。
简单工厂模式的缺点
工厂类集中了大量的创建逻辑,逻辑判断严重影响整个系统。
JAVA基础——设计模式之简单工厂模式的更多相关文章
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- C#设计模式(2)——简单工厂模式(转)
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
- 设计模式之简单工厂模式(Simple Factory)
原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- Java 设计模式01 - 简单工厂模式
先要学习设计模式之前的先看看一些基础 UML类图简单说明 可以先看看我的这篇博客: UML类图简单说明,学习编程思路的必会技能 接下来才是重点,开始我们的旅程吧. 一.UML类图展示 我们要用简单工厂 ...
- (1)java设计模式之简单工厂模式
一:简单工厂模式的优点 --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...
- Java设计模式(1)——简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 一.模式中包含的角色及其职责 1.工厂(Creator)角色 简单 ...
- Java 设计模式之 简单工厂模式(静态工厂方法模式)
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...
随机推荐
- go语言godep使用命令
godep 看见他的star比govendor,所以我使用它.官方地址 https://github.com/tools/godep install 1 go get github.com/too ...
- Tool:XMind
ylbtech-Tool:XMind XMind 是一款非常实用的商业思维导图软件,应用全球最先进的Eclipse RCP 软件架构,全力打造易用.高效的可视化思维软件,强调软件的可扩展.跨平台.稳定 ...
- bzoj 2783: [JLOI2012]树【树上差分】
注意是等于s不是大于s dfs,用set或者map存这条链到root的点权和sum[u],更新答案的时候查一下有没有s-sum[u]即可 #include<iostream> #inclu ...
- bzoj 2151: 种树【贪心+堆】
和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个"反悔"操作. 记录二元组的前驱pr后 ...
- bzoj 3456: 城市规划【NTT+多项式求逆】
参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...
- X86 Linux 下 SIGBUS 总结
SIGBUS 在 x86 Linux 上并不多见,但一旦出现,其调用堆栈常常让人摸不着头脑,加之信号问题各平台系统间差异较大,更让人难以理清,这里稍微总结一下 x86 Linux 上大概有哪些情形会触 ...
- LuoguP1948 电话线 【二分答案/图论】
其实是和奥格瑞玛一样的题啦. 但还是想了很久后看了题解. 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N&l ...
- 《windows核心编程系列》三谈谈内核对象及句柄的本质
内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一 ...
- 进击的Python【第十三章】:Web前端基础之HTML与CSS样式
进击的Python[第十四章]:Web前端基础之HTML与CSS样式 一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...
- VECTOR中pair的排序
vector中pair的排序方法 首先定义一个vector vector<pair<int,char> >vec; 调用排序函数sort sort(vec.begin(),ve ...