设计模式:简单工厂模式

简单工厂模式又叫做静态工厂方法模式,不属于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都会使用手机验证码方式登录。那么现在要把电话号码登录改成验证码登录。我们只需要新建一个电话号码验证码登录类,然后在工厂类上面修改一下就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值