您的位置:首页 > 其它

设计模式:简单工厂模式

2016-05-26 11:29 387 查看
简单工厂模式又叫做静态工厂方法模式,不属于23种设计模式中的一种。

简单工厂模式是工厂模式家族中最简单的一种。

简单工厂模式具有以下优点:

让外界可以从直接创建具体对象的尴尬局面解脱出来,仅仅负责“消费”对象就可以了

外界不必管这些对象究竟如何创建及组织的

明确了各自的职责与权利,有利于整个软件体系的优化

有优点自然会有缺点的,那么简单工厂模式还有什么不足的地方?、

集中了所有实例的创建逻辑,违反了高内聚责任分配原则

它所能创建的类只能是事先考虑到的

当具体产品类不断增多的时候,会出现要求工厂类根据不同条件创建不同的实例的需求

以上不足之处在工厂方法模式中有一定的改善。

继续说我们的简单工厂模式,尽管有不足,但是也有它合适使用的场景的

工厂类负责创建的对象比较少

客户只知道传入工厂类的参数,对于创建的过程并不关心

由于违反了高内聚责任分配原则,因此只能在比较简单的情况下使用

应用场景

当A类中需要调用B类中的方法的时候,很多人会选择使用new关键字,直接在A类中创建一个B实例,然后使用B实例去调用B实例中的方法。这种写法,从语法角度看来是没有任何问题的,但是这种做法的坏处在于,在A类中的方法直接调用了B类的类名。假如不只有在A类中使用到B类,在几十上百个类中都以这样的方法用到B类。一旦我们的需求更改需要用C类代替B类的话就要修改几十上百个地方。

又或者,需要使用两种不同方式(分别是B类和C类)去完成同一件事的时候,也是可以通过使用简单工厂模式去处理。

拿登录的例子来说

一般登录可能会同时存在两种登录方式,例如:手机号码登录和邮箱登录。两种登录都会有相同的方法,比如login()登录方法。那么我们新建一个接口Login:

public interface Login {
void login();
}


然后让邮箱登录的类与手机号码登录的类分别实现该接口:

邮箱登录

public class EmailLogin implements Login{

@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("邮箱登录");

}

}


电话登录

public class TelLogin implements Login{

@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("电话号码登录");
}

}


接下来使用一个工厂类负责生成这两个类的实例:

public class LoginFactory {
public static Login createLogin(String type){
switch(type){
case "email":
return new EmailLogin();

case "tel":
return new TelLogin();
default:
throw new RuntimeException("没有这种类型");
}
}
}


就这样外部(Main类)只需要传入对应的参数即可生成对应的实例,外部只管消费不管生产的过程。

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
LoginFactory.createLogin("email").login();
LoginFactory.createLogin("tel").login();
}

}


运行结果:


需要不同的对象传入不同的参数即可生成想要的对象。

现在的app很多都需要登录,但是往往注册完之后只登陆一次就不用在登录了。那么造成的结果就是用户非常容易忘记密码。因此很多app都会使用手机验证码方式登录。那么现在要把电话号码登录改成验证码登录。我们只需要新建一个电话号码验证码登录类,然后在工厂类上面修改一下就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息