《JAVA与模式》之简单工厂模式

转载 2016年08月31日 11:01:21

《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类作为简单工厂模式的典型例子叙述。

简单工厂模式的优点

  模式的核心是工厂类。这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者。

简单工厂模式的缺点

  这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。


简单工厂模式和工厂方法模式的区别

本文举了一个计算器的例子,该例子实现的功能是加减乘除的功能。 简单工厂模式:就是如何去实例化对象的问题,对于很容易变化的问题,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。例子如下:pa...
  • abc709272013
  • abc709272013
  • 2016年09月24日 22:33
  • 1415

设计模式——简单工厂(又叫静态工厂方法,不属于GOF23中设计模式)

简单工厂模式属于类的创新型模式,又叫静态工厂方法模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 —————————————————————————————————...
  • sunqingzhong44
  • sunqingzhong44
  • 2016年07月01日 10:01
  • 241

《JAVA与模式》之简单工厂模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建...
  • qilixiang012
  • qilixiang012
  • 2015年03月22日 00:45
  • 370

java深入浅出设计模式----简单的工厂模式(一)----业务逻辑分离

现在可扩展性和可维护性特别强,即便是想要计算多个数,那也很容易了,改动的地方很少。而且还能防止恶意的程序员篡改代码。 如果需要进行两个以上的数字的运算,在该接口中添加方法就行了。 package ...
  • escdelete
  • escdelete
  • 2015年01月14日 17:03
  • 734

简单工厂模式——加减乘除

还记得刚入门C语言的时候经常要写一些加加减减的程序来练练手。好吧,既然学了新语言,那就用新语言来写个简单的计算器吧!public class Calculator { public stati...
  • u010429311
  • u010429311
  • 2016年04月01日 00:01
  • 1764

Java与模式, 简单工厂模式

简单工厂模式又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。属于类的创建模式,结构如图:工厂类可以有多于一个的工厂方法,分别负责创建不同的产品对象。如图所示:如果系统仅有一个具体...
  • cheekis
  • cheekis
  • 2009年03月18日 09:20
  • 439

工厂方法模式VS简单工厂模式

One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。(2)理...
  • qq_28055429
  • qq_28055429
  • 2016年06月10日 23:14
  • 1573

《JAVA与模式》26天系列—第12天—享元模式=单例模式+工厂模式+合成模式

享元模式=单例模式+工厂模式+合成模式   单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 结构图: 注意多线程的单例。 package com.bankht.Fl...
  • m13666368773
  • m13666368773
  • 2012年06月26日 15:35
  • 5631

java工厂模式——简单工厂模式

当A对象需要调用B对象的方法是,许多初学者会选择使用new关键字来创建一个B实例,然后调用B实例的方法。从语法角度来看,这种做法没有任何问题,这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这...
  • huang_xw
  • huang_xw
  • 2012年06月16日 16:31
  • 5898

java语言实现创建型模式—简单工厂模式

一、描述 简单工厂模式又名静态工厂方法模式,是所有工厂模式中最简单的一个,它定义一个具体的工厂类来负责创建所有类的对象并初始化创建的对象,它主要由3部分组成:工厂类、抽象类、实现抽象类的具体类,然后通...
  • tongyuehong
  • tongyuehong
  • 2015年04月30日 21:38
  • 1310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《JAVA与模式》之简单工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)