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),是通过专门定义一个类来负责创建其他类的 ...
随机推荐
- bzoj 1922: [Sdoi2010]大陆争霸【dijskstra】
d[u]为u被几个节点保护,d1[u]为最早到u的时间,d2[u]为u的最早可进入时间(保护点都被打下来了的时候),然后最终最早进入时间就是max(d1[u],d2[u]),把这个作为权值放进小根堆, ...
- [App Store Connect帮助]八、维护您的 App(4.1)监控顾客评论:评分与评论概述
App Store 上的评分与评论 顾客可以按照 1 星至 5 星的级别对您的 App 进行评分.顾客还可为您的 iOS 和 macOS App 撰写评论,但无法为 Apple TVOS App 撰写 ...
- HttpSession讲解
1:session进行身份验证的原理: 当客户端第一次访问服务器的时候,此时客户端的请求中不携带任何标识给服务器,所以此时服务器无法找到与之对应的 session,所以会新建session对象,当服务 ...
- sublime 解决中文乱码
步骤: 在Sublime Text里,按ctrl+`,打开Console,一次性输入如下代码: import urllib.request,os; pf = 'Package Control.subl ...
- [BZOJ3531] Peaks加强版
Peaks Peaks 加强版 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越 ...
- [poj2096] Collecting Bugs【概率dp 数学期望】
传送门:http://poj.org/problem?id=2096 题面很长,大意就是说,有n种bug,s种系统,每一个bug只能属于n中bug中的一种,也只能属于s种系统中的一种.一天能找一个bu ...
- GOTO语句以及GOTO机制的模式实现
goto语句提供了方法内部的任意跳转,它在特殊场景下被应用. 而假设一个对象执行一个方法后,我们期望其余任何对象都可以捕获它,然后自己执行某些操作,那么可以怎么实现呢 class 皇宫 { void ...
- 窗口Dialog
Dialog是窗口的意思,它是Window的子类.与frame相比,frame是我们大的窗口,而dialog便是那种弹出来和你说话的对话框. Dialog类的默认布局是BorderLayout Dia ...
- 鼠标适配器Adapter
先来看看概念: 现在我们要写一个这样的东西,就是一个窗口,然后鼠标点一下就有一个小圆点,like this: 来我们来看代码: import java.awt.*; import java.util. ...
- sed练习第一节
ed语法和基本命令 employee.txt文件内容如下: 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104 ...