《JAVA与模式》之简单工厂模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明:
就拿登录功能来说,假如应用系统需要支持多种登录方式如:口令认证、域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用户)。那么自然的做法就是建立一个各种登录方式都适用的接口,如下图所示:
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 { /** * 业务逻辑 */ } }}
简单工厂模式的结构如下图:
我们可以设想一下真实的场景,如果把上面的Test当做一个servlet的话,当客户端发起登录请求——>请求交给服务端的Servlet——>Servlet根据客户端传递的loginType调用工厂类LoginManager的factory()方法——>factory()方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)并返回——>登录验证类调用方法verify()验证用户名密码是否正确
假如不使用简单工厂模式则验证登录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类作为简单工厂模式的典型例子叙述。
简单工厂模式的优点
模式的核心是工厂类。这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者。
简单工厂模式的缺点
这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。
转载于:https://www.cnblogs.com/zhaolizhe/p/6924022.html
《JAVA与模式》之简单工厂模式相关推荐
- java简单工厂模式_Java 简单工厂模式
Java 简单工厂模式 2014-05-28·WeaponX 3717 次浏览 ## 介绍 简单工厂模式又称静态工厂模式. 简单工厂模式由工厂类角色.抽象产品角色和具体产品角色组成. 工厂类角色是本模 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】
目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式 看一个具体的需求 看一个披萨的项目:要便 ...
- Java设计模之简单工厂模式
设计模式之工厂模式一简单工厂模式 工厂模式由来: 在我们创建对象的时候使用,使用new操作的.如果多个对象创建都使用new会.所以工厂模式就是用来代理new操作的一种模式.根据工厂模式由来,我们可以看 ...
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3) ...
- 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...
- 设计模式—工厂模式之简单工厂模式
1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂 ...
- 策略模式与简单工厂模式区别(转)
最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简 ...
- 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...
- 大话设计模式-策略模式与简单工厂模式
来源:http://blog.csdn.net/wulingmin21/article/details/6712684 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策 ...
最新文章
- 电脑开不了不用U盘怎么装系统?
- 这声音酥了!萌妹程序员鼓励师24小时在线陪你写代码,给我吹爆这个VSCode插件...
- MAC地址如何在windows与unix下查看?
- 小程序和app用什么样的服务器,小程序和APP的本质区别是什么?哪个更值得开发?...
- docker的安装与安装mysql(mac,centos为例)
- 视觉SLAM笔记(15) 李群与李代数
- Java 的强引用、弱引用、软引用、虚引用
- C++学习笔记 之 循环
- 【语音编码】基于matlab PCM编解码【含Matlab源码 555期】
- python 斯皮尔曼相关系数_斯皮尔曼等级相关系数(Spearmansrankcorrelationcoefficient)
- 太实用了!这几个Python数据可视化案例!
- 送给计算机老师平安夜贺卡,平安夜小朋友送老师的贺卡寄语
- 基于51单片机的多线程操作系统设计
- 基于web的木子日记个人博客网站的设计与实现
- vue项目中eslint规则校验配置
- 中职计算机应用教学的重要性,中职《计算机应用基础》教学中理实一体化的有效开展...
- 做金融理财直播,直播内容有什么?
- vue watch store
- 每日一练蓝桥杯C语言:暴力枚举
- win32项目和win32控制台程序的区别