所谓工厂,就是要造产品,比如一个小型砖瓦厂,只有一个窑,既能造砖又能造瓦,这种叫简单工厂模式。规模稍大一点呢,我多个窑,有的窑专门造砖,有的窑专门造瓦,想造别的,比如瓷砖,我再用个专门的窑,这种成了工厂方法模式。但若是我开个汽车装配厂,我既要轮胎,又要发动机,又要车架等等组合型的,那就要抽象工程模式。所以,我们的工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。

首先,简单工厂:

   所谓简单工厂,就是你告诉我,你想要什么产品,我能产这种产品,就给你生产。简单工厂模式又叫静态工厂模式,因为这个工厂产出的产品是开始就定死的,就能造那几种,多了没办法。而设计原则是新增产品不要修改原有的代码,就好比你一个砖瓦窑想要生产瓷器,即便不砸了重来,也得内部整改很多东西。
   以下的代码示例是一个简单工厂类,该工厂类可以生产手机, 且只能生产IPhone和Samsung两款手机。倘若你想生产小米手机,不好意思,目前生产不了,RuntimeException,你非要生产呢,继续加判断,就等于改掉了目前的工厂类。
   代码:

  1. public class SimplePhoneFactory {
  2.  
  3. public static Cellphone getCellphone(String type){
  4. if("iPhone".equals(type)){
  5. return new IPhone();
  6. }else if("Samsung".equals(type)) {
  7. return new Samsung();
  8. }else {
  9. throw new RuntimeException("没有正确的手机类型创建");
  10. }
  11. }
  12. }

  

工厂方法:

    工厂方法是在简单工厂的基础上,可以扩展的工厂,从设计的思路上,更加清晰的去管理工厂的生产。将每个产品的工厂实现细分出来。这种模式实现上面的手机工厂的话,就是一个广义的工厂(接口),然后具体的实现每个产品的工厂实现。如果要新增产品的话,直接加一个该新产品的实现工厂即可,不用改动原有代码。
    代码:

  1. /*
  2. 工厂方法接口
  3. */
  4. public interface PhoneFactory {
  5. public Cellphone getPhone();
  6. }

 

  1. /*
  2. * @Description: iPhone 工厂
  3. */
  4. public class IPhoneFactory implements PhoneFactory{
  5.  
  6. @Override
  7. public Cellphone getPhone() {
  8. // TODO Auto-generated method stub
  9. return new IPhone();
  10. }
  11.  
  12. }
  1. /*
  2. * @Description:samsung工厂
  3. */
  4. public class SamsungPhoneFactory implements PhoneFactory{
  5.  
  6. @Override
  7. public Cellphone getPhone() {
  8. // TODO Auto-generated method stub
  9. return new Samsung();
  10. }
  11.  
  12. }

 以上代码可以看出,每个产品都需要自己的实现工厂,这时如果我们需要新增加新产品,比如小米手机,只需要新增一个MIPhoneFactory来实现PhoneFactory即可。

抽象工厂:

    开头也说了,针对于组合型产品,我们使用抽象工厂。也就是说,这种工厂相对其他两种,复杂的多。而实际上,我们没办法拿抽象工厂和简单工厂已经工厂方法比较,因为他们不是用来解决同一类问题的,基本上没有什么可比性。抽象工厂用来针对的是产品族,而简单工厂和工厂方法都是针对单一产品的,如果真让抽象工厂去对单个产品进行管理,反倒无能为力。
   这里我们还以手机为例,我们要生产手机,需要很多配件,比如CPU,比如相机,比如内存等等,我们暂且只认为决定一款手机好坏只有这三个组件。使用抽象工厂来实现。
   首先,我们定义CPU的接口,已经能生产的一些列CPU,这里以GoodCPU和BadCPU为例:

  1. public interface CPU {
  2. void run();
  3. void start();
  4. }
  5. //高端CPU
  6. class GoodCUP implements CPU{
  7.  
  8. @Override
  9. public void run() {
  10. System.out.println("高端CPU运转方法。。。");
  11.  
  12. }
  13.  
  14. @Override
  15. public void start() {
  16. System.out.println("高端CPU开始方法。。。");
  17.  
  18. }
  19.  
  20. }
  21.  
  22. //低端CPU
  23. class BadCPU implements CPU{
  24.  
  25. @Override
  26. public void run() {
  27. System.out.println("低端CPU运转方法。。。");
  28.  
  29. }
  30.  
  31. @Override
  32. public void start() {
  33. System.out.println("低端CPU开始方法。。。");
  34.  
  35. }
  36.  
  37. }

  然后是相机接口,以及相关的相机生产类型,其中的方法是随便写的。

  1. public interface Camera {
  2. public void take();
  3.  
  4. }
  5.  
  6. class GoodCamera implements Camera{
  7.  
  8. @Override
  9. public void take() {
  10. System.out.println("高端相机拍照。。。");
  11.  
  12. }
  13.  
  14. }
  15.  
  16. class BadCamera implements Camera{
  17.  
  18. @Override
  19. public void take() {
  20. System.out.println("低端相机拍照。。。");
  21.  
  22. }
  23.  
  24. }

  最后一个内存的接口已经一系列类型:

  1. public interface Memory {
  2.  
  3. void work();
  4. }
  5.  
  6. class GoodMemory implements Memory{
  7.  
  8. @Override
  9. public void work() {
  10. System.out.println("高性能内存工作");
  11.  
  12. }
  13.  
  14. }
  15. class BadMemory implements Memory{
  16.  
  17. @Override
  18. public void work() {
  19. System.out.println("低性能内存工作");
  20.  
  21. }
  22.  
  23. }

  

我们前面说了,抽象工厂就是利用一些列组件组合产品的工厂,上面我们写的CPU,相机,内存都是我们要组件手机的组件。现在,我们开始写我们的抽象工厂。当然为了方便,肯定要有工厂接口:

  1. public interface AbPhoneFactory {
  2. CPU getCPU();
  3. Camera getCamera();
  4. Memory getMemory();
  5. }

  然后,我们根据自己的需要,随机组合几种组件,即可得到我们的产品,当然这是一组(产品)组合出来的最终产品。

比如我们用好的CPU,好的内存,好的相机组合成一个好的手机:

  1. public class GoodsPhoneFactory implements AbPhoneFactory{
  2.  
  3. @Override
  4. public CPU getCPU() {
  5. // TODO Auto-generated method stub
  6. return new GoodCUP();
  7. }
  8.  
  9. @Override
  10. public Camera getCamera() {
  11. // TODO Auto-generated method stub
  12. return new GoodCamera();
  13. }
  14.  
  15. @Override
  16. public Memory getMemory() {
  17. // TODO Auto-generated method stub
  18. return new GoodMemory();
  19. }
  20.  
  21. }

  也可以用差的CPU,差的内存,差的相机组合成比较差劲的手机:

  1. public class BadPhoneFactory implements AbPhoneFactory{
  2.  
  3. @Override
  4. public CPU getCPU() {
  5. // TODO Auto-generated method stub
  6. return new BadCPU();
  7. }
  8.  
  9. @Override
  10. public Camera getCamera() {
  11. // TODO Auto-generated method stub
  12. return new BadCamera();
  13. }
  14.  
  15. @Override
  16. public Memory getMemory() {
  17. // TODO Auto-generated method stub
  18. return new BadMemory();
  19. }
  20.  
  21. }

 当然你也可以乱组合成中等的,这都是随你便了,只要加一个工厂实现即可。

最后,我们来总结一下吧:

对于单一产品,简单工厂更简单,但是新增产品时却很乏力,或者说不符合设计原则,而工厂方法是不修改原有类的前提下,新增工厂类实现,更符合设计原则。是不是我们在单一产品的时候就该选择工厂方法了呢?下面给出这么一个对比:

    -- 结构复杂度 简单工厂更加简单 简单工厂优于工厂方法

   -- 代码复杂度 工厂方法复杂度较高 简单工厂优于工厂方法
    -- 客户端编程难度 工厂方法客户端需要了解更多的实现工厂 简单工厂优于工厂方法
   -- 管理难度 工厂方法由于实现工厂类较多,管理更难 简单工厂优于工厂方法

结合以上四点,我们说简单工厂比工厂方法更加易用。这也就是开发时候简单工厂比工厂方法使用的更多的原因。

对于产品族,如果使用工厂模式,唯一的选择--抽象工厂。

OK,更多详细代码和本次测试代码请参考github:https://github.com/LiuJishuai/designPatterns。

java设计模式--工厂模式的更多相关文章

  1. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  2. 一张图搞定Java设计模式——工厂模式! 就问你要不要学!

    小编今天分享的内容是Java设计模式之工厂模式. 收藏之前,务必点个赞,这对小编能否在头条继续给大家分享Java的知识很重要,谢谢!文末有投票,你想了解Java的哪一部分内容,请反馈给我. 获取学习资 ...

  3. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  4. 学习:java设计模式—工厂模式

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...

  5. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  6. java设计模式-工厂模式(springweb为例子)

    一般而言,工厂模式分为3种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种工厂模式逐层深入吧. 一,从springWeb.jar包使用抽象工厂模式的一个例子聊起 之前对spring各种痴迷,所以在需 ...

  7. java设计模式—工厂模式

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  8. Java设计模式——工厂模式

    一.工厂模式分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: (1)简单工厂模式(Simp ...

  9. Java设计模式の工厂模式

    -------------------------------------------------------- 目录:  一.序言 二.简单工厂模式 三.工厂方法模式 四.简单工厂和工厂方法模式的比 ...

  10. 1.Java设计模式-工厂模式

    1.简单工厂模式(Factory Method) 常用的工厂模式是静态工厂模式,利用static修饰方法,作为一种类似于常见的工具类Utils等辅助效果,一般情况下工厂类不需要实例化. //1.定义一 ...

随机推荐

  1. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式

    本文演示了JSP中获取HTTP参数的几种方式,还有action中获取HTTP参数的几种方式. 1. 创建JSP页面(testParam.jsp) <%@ page language=" ...

  2. Swift 自动布局框架-SnapKit

    官方网址:http://snapkit.io/ Github: https://github.com/SnapKit/SnapKit SnapKit is a DSL to make Auto Lay ...

  3. Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法

    错误为:为应用程序池“XXXXXX”提供服务的进程在与“Windows Process Activation Service”通信时出现严重错误.该进程 ID 为"XXX".数据字 ...

  4. LoadRunner执行过程报错“Failed to connect to server "xxx.xxx.xxx.xxx:xx":[10060] connetion time out”

    执行性能测试过程中,LR报错: Action.c(6):Error -27796: Failed to connect to server "xxx.xxx.xxx.xxx:xx" ...

  5. wndows系统命令总结

    window8系统下 打开运行窗口----------鼠标放到任务栏的windows图标下,右击,弹出菜单中如上图或者 打开运行窗口---------按“WIN+R”键, cmd-------打开命令 ...

  6. sencha cmd 更新日志

    http://cdn.sencha.com/cmd/6.2.1.29/release-notes.html

  7. drupal7 form模板复写方法

    给form制作一个template 从官方的drupal api document中可得到form有#theme这个参数,它可以指定form使用一个模板来用于form的基本布局,#theme的值必须是 ...

  8. MVC5入门

    http://www.cnblogs.com/youring2/p/mvc-5-examining-the-edit-methods-and-edit-view.html

  9. Xcode 中关于"#"的小知识

    在代码中使用Autolayout时,大家都会使用NSDictionaryOfVariableBindings这个宏,这个宏可以生成一个变量名到变量值映射的Dictionary.比如NSDictiona ...

  10. Maven进价:使用m2eclipse创建web项目

    1.新建Maven项目 2.设置项目空间 3.选择maven-archetype-webapp 4.填写Maven坐标 Maven坐标:groupId:artifactId:packaging:ver ...