java简单工厂模式是什么

能不能写个小例子给我参考下谢谢... 能不能写个小例子给我参考下
谢谢
展开
 我来答
似灵杉0Ey
推荐于2017-10-06 · TA获得超过313个赞
知道小有建树答主
回答量:341
采纳率:55%
帮助的人:146万
展开全部
简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(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类作为简单工厂模式的典型例子叙述。

简单工厂模式的优点

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

简单工厂模式的缺点

  这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。
lmdy2001
2014-02-26 · TA获得超过592个赞
知道小有建树答主
回答量:491
采纳率:0%
帮助的人:161万
展开全部
就是专门写一个类,他有一个方法根据传入的参数不同,返回不同的对象。
比如有一台自动售货机AutoSeller, 然后它卖很多饮料Drink, 有茶Tea, 有可乐Cola, 当你去买的时候,你可能是通过按不同的按钮,但对AutoSeller的实现来说,他可能都是同样的方法,只是根据不同的参数(按钮),返回给你不同的对象(Tea或Cola)。
public interface Drink {
enum Type {TEA, COLA};
}
public Tea implements Drink {
}
public Cola implements Drink {
}
public class AutoSeller {//工厂
public static Drink getDrink(Drink.Type type) {
switch(type) {
case TEA:
return new Tea();
case COLA:
return new Cola();
default:break;
}
}
}

如上, 在你选择饮料按下按钮里, 自动售货机的代码可能只要执行AutoSeller.getDrink(type)就可以返回你想要的饮料了。
之所以要把Drink定义成接口,一般来讲,用这种架构的话, Drink里面会声明一些接口方法, 这些方法是Tea和Cola都需要的, 但Drink不用关心方法的具体实现, 具体实现只要由Tea和Cola去完成。
而你通过AutoSeller.getDrink(type)去拿到一个Drink对象后,可以用这个对象直接去调Drink中声明的方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
johnwanz
2015-07-13 · TA获得超过781个赞
知道小有建树答主
回答量:716
采纳率:80%
帮助的人:235万
展开全部

所谓简单工厂模式, 就是将容易变化的地方, 考虑用一个独立Class来进行创造实体(Object)的过程.


目的: 合并创造实体的动作, 统一以变量处理之. 使得新增实体种类时, 可以不修改到已有程序.


举例来说,

* 虚拟码, 不可执行.

* 假设进行加减乘除运算, 分别使用不同的物件, 对变量A, B进行运算.

// 简单工厂模式的写法 (已宣告完加减乘除类别, 父类别Operation)
class OperationFactory
{
    Operation createOperate(string operate)
    {
        Operation operr = null;
        switch (operate)
        {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;
        }
        return oper;
    }
}


// 用户端写法
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
result = oper.GetResult();


范例来源: 大话设计模式 - 悦之文化出版

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tianlanyijiu1
推荐于2017-10-12 · TA获得超过195个赞
知道小有建树答主
回答量:294
采纳率:100%
帮助的人:150万
展开全部
简单工厂模式就是把创建对象的方法封装起来。如:
public class Animal{
private String id;
private String name;
}

public class Tiger extends Animal{
private String id;
private String name;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
29cyy
2015-09-09 · TA获得超过2186个赞
知道小有建树答主
回答量:2826
采纳率:45%
帮助的人:586万
展开全部
接着楼上写

 public class Animal{}
 
 public class Cat extends Animal{}
 
 public class Dog extends Animal{}
 
 public class Fish extends Animal{}
 
 
 /** 工厂类 */
 public class AnimalFactory {
     public static getAnimal(String name){
         Animal animal = null;
         if("Cat".equals(name)){
             animal = new Cat();
         }else if("Dog".equals(name)){
             animal = new Dog();
         }else if("Fish".equals(name)){
             animal = new Fish();
         }
         return animal;
     }
  }
  
  public class Test{
      public static void main(String[] args){
          Animal a1 = AnimalFactory.getAnimal("Cat");
      }
  }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式