设计模式:简单工厂模式
2016-05-26 11:29
387 查看
简单工厂模式又叫做静态工厂方法模式,不属于23种设计模式中的一种。
简单工厂模式是工厂模式家族中最简单的一种。
简单工厂模式具有以下优点:
让外界可以从直接创建具体对象的尴尬局面解脱出来,仅仅负责“消费”对象就可以了
外界不必管这些对象究竟如何创建及组织的
明确了各自的职责与权利,有利于整个软件体系的优化
有优点自然会有缺点的,那么简单工厂模式还有什么不足的地方?、
集中了所有实例的创建逻辑,违反了高内聚责任分配原则
它所能创建的类只能是事先考虑到的
当具体产品类不断增多的时候,会出现要求工厂类根据不同条件创建不同的实例的需求
以上不足之处在工厂方法模式中有一定的改善。
继续说我们的简单工厂模式,尽管有不足,但是也有它合适使用的场景的
工厂类负责创建的对象比较少
客户只知道传入工厂类的参数,对于创建的过程并不关心
由于违反了高内聚责任分配原则,因此只能在比较简单的情况下使用
又或者,需要使用两种不同方式(分别是B类和C类)去完成同一件事的时候,也是可以通过使用简单工厂模式去处理。
然后让邮箱登录的类与手机号码登录的类分别实现该接口:
邮箱登录
电话登录
接下来使用一个工厂类负责生成这两个类的实例:
就这样外部(Main类)只需要传入对应的参数即可生成对应的实例,外部只管消费不管生产的过程。
运行结果:
需要不同的对象传入不同的参数即可生成想要的对象。
现在的app很多都需要登录,但是往往注册完之后只登陆一次就不用在登录了。那么造成的结果就是用户非常容易忘记密码。因此很多app都会使用手机验证码方式登录。那么现在要把电话号码登录改成验证码登录。我们只需要新建一个电话号码验证码登录类,然后在工厂类上面修改一下就好了。
简单工厂模式是工厂模式家族中最简单的一种。
简单工厂模式具有以下优点:
让外界可以从直接创建具体对象的尴尬局面解脱出来,仅仅负责“消费”对象就可以了
外界不必管这些对象究竟如何创建及组织的
明确了各自的职责与权利,有利于整个软件体系的优化
有优点自然会有缺点的,那么简单工厂模式还有什么不足的地方?、
集中了所有实例的创建逻辑,违反了高内聚责任分配原则
它所能创建的类只能是事先考虑到的
当具体产品类不断增多的时候,会出现要求工厂类根据不同条件创建不同的实例的需求
以上不足之处在工厂方法模式中有一定的改善。
继续说我们的简单工厂模式,尽管有不足,但是也有它合适使用的场景的
工厂类负责创建的对象比较少
客户只知道传入工厂类的参数,对于创建的过程并不关心
由于违反了高内聚责任分配原则,因此只能在比较简单的情况下使用
应用场景
当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都会使用手机验证码方式登录。那么现在要把电话号码登录改成验证码登录。我们只需要新建一个电话号码验证码登录类,然后在工厂类上面修改一下就好了。
相关文章推荐
- Python动态类型的学习---引用的理解
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- MySQL 优化
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Google排名优化的几个影响因素
- 土人系列AS入门教程 -- 对象篇
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- 交换机升级排障实例
- C#中尾递归的使用、优化及编译器优化
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 对优化Ruby on Rails性能的一些办法的探究