《JAVA与模式》之简单工厂模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明:
就拿登录功能来说,假如应用系统需要支持多种登录方式如:口令认证、域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用户)。那么自然的做法就是建立一个各种登录方式都适用的接口,如下图所示:
aaarticlea/png;base64,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" alt="" />
public interface Login {
//登录验证
public boolean verify(String name , String password);
}
public class DomainLogin implements Login { @Override
public boolean verify(String name, String password) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
return true;
} }
public class PasswordLogin implements Login { @Override
public boolean verify(String name, String password) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
return true;
} }
我们还需要一个工厂类LoginManager,根据调用者不同的要求,创建出不同的登录对象并返回。而如果碰到不合法的要求,会返回一个Runtime异常。
public class LoginManager {
public static Login factory(String type){
if(type.equals("password")){ return new PasswordLogin(); }else if(type.equals("passcode")){ return new DomainLogin(); }else{
/**
* 这里抛出一个自定义异常会更恰当
*/
throw new RuntimeException("没有找到登录类型");
}
}
}
测试类:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String loginType = "password";
String name = "name";
String password = "password";
Login login = LoginManager.factory(loginType);
boolean bool = login.verify(name, password);
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}
}
aaarticlea/png;base64,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Dx+WlZXV1tZWV1d//PixsLCwtra2tLT07du3L1++TE1Nramp+fjx4/Xr13Nycj5//pyRkREXFwdmeyopKXny5Mnly5ejoqKePn2akpISERHh5eX1/PlzLBb7y3afHjsYZNCvAtSgQSiAxoQhK8jgpSE7+lEoFFbrBIPBYLVa9PX10en07u5u1lNW6wRo5gdTiIPlOBwONC9QKBTQcYdKpdLpdAKBAOKYQCCQSCTQ1+cX7G/498AggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7cEggyCI7f0fAiAL8tjie04AAAAASUVORK5CYII=" alt="" />
我们可以设想一下真实的场景,如果把上面的Test当做一个servlet的话,当客户端发起登录请求——>请求交给服务端的Servlet—— >Servlet根据客户端传递的loginType调用工厂类LoginManager的factory()方法——>factory() 方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)并返回——>登录验证类调用方法 verify()验证用户名密码是否正确
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA40AAAGnCAIAAACcniUXAAAgAElEQVR4nOzdeXST973gf0huOtMlnc5N23OnPZP2Tu/8ztymnWbmtM102uS2Sdp0Sdo0NyFptjJZSiAJCfsaloAdsDGrsTEG2+AFMHg3Bm94xXjF+45ly7ssyZKsff/9IUdHxZBgoUfSI79ff9wTS18//sji3vu2pOf7LHICAAAAwWdRoAcAAAAAboFOBQAAQDCiUwEAABCM6FQAAAAEIzoVAAAAwYhOBQAAQDCiUwEAABCM6FQAAAAEIzoVAAAAwYhOBQAAQDCiUwEAABCM6FQAAAAEIzoVAAAAwYhOBQAAQDCiUwEAABCM6FRgVmdn57Jly57GPL3++us5OTmBfvYAACGITgVmFRcX/+hHP0rAPP35z3/esWNHoJ89AEAIolOBWQUFBT/+8Y8DPYX4rFmzZsOGDYGeAgAQguhUYBad6h06FQAgEDoVmEWneodOBQAIhE4FZtGp3qFTAQACoVOBWXSqd+hUAIBA6FRgFp3qHToVACAQOhWYRad6h04FAAiETgVm0aneoVMBAAKhU4FZdKp36FQAgEDoVGAWneodOhUAIBA6FZhFp3qHTgUACIROBWbRqd6hUwEAAqFTgVl0qnfoVACAQOhUYBad6h06FQAgEDoVmOW3Tp2ZmZFKpSaT6U4WOxwOg8EwNjZmsVhut8BoNM69XalUymSyuxr0ztCpAACB0KnALEE71W63OxwO138PDw9nZmZevXr1Dr9RqVQmJyd3d3ffMm1tNtvU1FRra6vVanU6nRMTEzKZzGQyVVZWXrx40el0GgyGoaEh3z2Um9GpAACB0KnALEE7dWhoSCKRjI+Pj42NDQwMnD9//rXXXhv/1MjIiEQi0Wq17vV2u91oNKrVapPJZDKZtm7dun///sHBQZPJND09rVKpXFXqMjMzs2TJErVa7XQ6U1JSMjIyxsbG0tPTjx075nQ6BwcH9+3bJ9DjctKpAADB0KnALOE61Wg0btq0admyZR9//PGaNWtWrFixcePGd955Z+fOndu3b9+5c+fy5cufe+656upqz2/p7OxMS0sbGBgYGBgoKSlJTk5uamoaGBg4efJkcnLy5OSk89OcnZycXLZs2cjIiEajSUpKysjIGBwcTE5OPnz4sFar7e3tdQWrQOhUAIBA6FRglnCdmpmZuXbt2oqKCofDkZ6evn79eoVC4XA4bDbb6OiozWbbt29fQ0PDTR8zbW9vX7ly5dyjRUVF7dq1SyqVOp1OhUJx/vz58PDw8PDwZcuWrV69et26devXr9++ffubb7756quvuu6iUwEAYkSnArOE61SJRDI1NWW1Wq9evbpmzZrVq1dfvHixoKAgPT39xz/+cXV1tet9fPcHWF3upFMdDofZbDYYDAaD4fjx4y0tLRKJRKlUGgwGnU6n1WoNBoNcLm9paRHicbnQqQAAgdCpwCzhOtVisdjt9sHBwbS0tKSkpNLS0srKyhs3bqxevfrgwYMqleqmQnW5k051Op1arfbSpUsOh2PFihXXr1+/evVqSUlJaWnp+fPnz5w5U1pampube+TIkfPnz9/yp9w9OhUAIBA6FZgl6HlUcrn82rVrjY2NU1NTY2NjmZmZH3744aFDh2Qymd1uv+W3NDc3//nPf06e47XXXtuyZYu7U8fHx1etWuVwON5//32JRKJSqRQKRXV19YULF+rq6hQKxdTU1PDw8MTEhEAPjU4FAAiETgVmCdqpGo1mcnJSq9XqdLry8vJt27Z98sknmzZtunTp0tTUlM1mu2m9VqstKip67733uue4cOFCaWmpXq93rRwZGXn99dcNBsP+/ftlMtnZs2fj4uI2b968du3ayMjIQ4cOHTt2LCoqSqVSCfTQ6FQAgEDoVGCWoJ1qs9nUanV9ff358+czMjIqKyt7e3tLS0szMjLCwsIiIiL27dtXVFSkUChc68fHx8+cOXP06NG5h1Kr1TMzM+4vp6enjx071t/fX1NTo9frt23blpCQsG3btvDw8JiYmPXr1589e/bNN990d63P0akAAIHQqcAs4Tq1v7+/s7OztbX14MGD77777vHjxysrKysrK69cuRIXF/fMM8+Eh4dHRUWVlZW5X/Vsa2uLjIysra393IMbjcba2trY2NjCwkKJRLJhw4aqqqr4+Pi0tLTLly/v3bu3q6vrvffeE+JxudCpAACB0KnALOE6taurq7m5ubu7OyoqasOGDZc/VVBQEBcX9+677/b398vlcvflpqxWa3l5+fbt2z13/r8llUpVUlKSn5+fmppaVlZ248aN9evX06kAgNBApwKzBH3f3yU1NfXEiRPuLy0WS0NDQ0REhFwu91w2Ojqam5ubm5v7uQccHx+Pj4/P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" alt="" />
假如不使用简单工厂模式则验证登录Servlet代码如下(假设Test为一个Servlet,变量loginType、name、password表示从客户端传递过来的参数):
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub String loginType = "password";
String name = "name";
String password = "password";
//处理口令认证
if(loginType.equals("password")){
PasswordLogin passwordLogin = new PasswordLogin();
boolean bool = passwordLogin.verify(name, password);
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}
//处理域认证
else if(loginType.equals("passcode")){
DomainLogin domainLogin = new DomainLogin();
boolean bool = domainLogin.verify(name, password);
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}else{
/**
* 业务逻辑
*/
}
}
}
上面的代码会不会很蛋疼啊。。。呵呵
《JAVA与模式》一书中使用java.text.DataFormat类作为简单工厂模式的典型例子叙述。
简单工厂模式的优点
模式的核心是工厂类。这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者。
简单工厂模式的缺点
这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。
from:http://www.cnblogs.com/java-my-life/archive/2012/03/22/2412308.html
《JAVA与模式》之简单工厂模式的更多相关文章
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- JAVA基础——设计模式之简单工厂模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- (转)java反射机制及简单工厂模式
第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...
随机推荐
- MySQL中文全文搜索
我们在mysql数据中可以使用match against语句解决中文全文搜索的问题 先看一个例句: SELECT * FROM v9_search WHERE `siteid`= '1' AND `t ...
- ubuntu中文字符集格式转换
- cocoapods安装好后repo换源
1.pod repo 然后会出现以下内容,如下是我已经换了之后的,而你的URL还是github的 master - Type: git (master) - URL: https://git.cod ...
- linux环境下 mysql数据库忘记密码 处理办法UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ;
整个修改过程大概3-10分钟(看个人操作),这个时间内mysql出于不需要密码就能登陆的状态,请设法保证系统安全 不罗嗦直接上步骤 1.vi /etc/my.cnf 在[mysqld]下,添加一句:s ...
- Node.js基本开发流程
创建一个hello world: 1.打开一个文本编辑器,在其中输入console.log("hello world"),并保存为hello.js; 注意:输入中文如果编码不是ut ...
- Webdriver API之元素定位
Webdriver提供了8种元素定位方法:id.name.class name.tag name.link text.partial link text.xpath.css selector 一.以上 ...
- .NET枚举类型转为List类型
如图所示这个竞卖状态,原先是在前端界面通过html代码写死的几个状态,现在需要改为动态加载.这个几个状态是定义的枚举类型. 1:定义一个枚举类型 /// <summary> /// ...
- sqoop关系型数据迁移原理以及map端内存为何不会爆掉窥探
序:map客户端使用jdbc向数据库发送查询语句,将会拿到所有数据到map的客户端,安装jdbc的原理,数据全部缓存在内存中,但是内存没有出现爆掉情况,这是因为1.3以后,对jdbc进行了优化,改进j ...
- Set ,List,ArrayList,LinkedList,Vectory,HashMap,Hashtable,HashSet,TreeSet,TreeSet
Set与List区别: 两者都是接口,并继承Collection接口:List有序,允许重复:Set无序,不能重复: ArrayList与LinkList区别: ArrayList是动态数组,查询效率 ...
- 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑
eleme写的基于vue2.0的前端组件库: http://element.eleme.io 我在平时使用过程中,遇到的问题. 自定义表单验证出坑: 1: validate/resetFields 未 ...