JAVA设计模式学习4——简单工厂模式

2019-03-07 21:52|来源: 网络

从这节开始学习设计模式,首先学习创建模式,其中工厂模式是创建模式里面最常见也常用的一种,工厂模式又分简单工厂模式(Simple Factory),工厂方法模式(Factory Method)和抽象工厂模式(Abstractor Factory),这里先学习最简单的也就是简单工厂模式。


简单工厂模式(Simple Factory)也称静态工厂方法模式,是工厂方法模式的特殊实现。简单工厂模式的一般性结构如下图:


       
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类型的实例,下面我们拿实例来介绍简单工厂模式。如下图,抽象类型车包括子类火车,汽车,拖拉机。



工厂根据传入的参数来创建具体车的类型。上图中无法形象地表示抽象类所以用接口代替了。


  1. package com.pattern.SimpleFactory;  

  2. /**

  3. *

  4. *【描述】:工厂类

  5. *【作者】:alaric

  6. *【时间 】:May 20, 2012

  7. *【文件】:com.pattern.SimpleFactoryFactory.java

  8. *

  9. */  

  10. public class Factory {  

  11. /**

  12. *

  13. *【描述】:创建车的实例 这个类里面的判断代码在实际应用中多配置成map,如果用spring 则可以配置在bean的xml内

  14. *【作者】:alaric

  15. *【时间 】:May 20, 2012

  16. * @throws TypeErrorException

  17. *

  18. */  

  19.    public TrafficMachine creator(String type) throws TypeErrorException{  

  20.        if(type.equals("Automobile")){  

  21.            return new Automobile();  

  22.        }else if (type.equals("Tractor")) {  

  23.            return new Tractor();  

  24.        }else if (type.equals("Train")) {  

  25.             return new Train();  

  26.        }else{  

  27.            throw new TypeErrorException("not find "+type);  

  28.        }  

  29.    }  

  30. }  

  31. package com.pattern.SimpleFactory;  

  32. /**

  33. *

  34. *【描述】:汽车类

  35. *【作者】:alaric

  36. *【时间 】:May 20, 2012

  37. *【文件】:com.pattern.SimpleFactoryAutomobile.java

  38. *

  39. */  

  40. public class Automobile extends TrafficMachine{  

  41.     @Override  

  42.     public void traffic() {  

  43.        // TODO Auto-generated method stub  

  44.     }  

  45. }  

  46. package com.pattern.SimpleFactory;  

  47. /**

  48. *

  49. *【描述】:拖拉机

  50. *【作者】:alaric

  51. *【时间 】:May 20, 2012

  52. *【文件】:com.pattern.SimpleFactoryTractor.java

  53. *

  54. */  

  55. public class Tractor extends TrafficMachine{  

  56.     @Override  

  57.     public void traffic() {  

  58.         // TODO Auto-generated method stub  

  59.    }  

  60.    /**

  61.     *

  62.     *【描述】:耕地

  63.     *【作者】:alaric

  64.     *【时间 】:May 20, 2012

  65.     *

  66.     */  

  67.    public void plough(){  

  68.    }  

  69. }  

  70. package com.pattern.SimpleFactory;  

  71. /**

  72. *

  73. *【描述】:火车

  74. *【作者】:alaric

  75. *【时间 】:May 20, 2012

  76. *【文件】:com.pattern.SimpleFactoryTrain.java

  77. *

  78. */  

  79. public class Train extends TrafficMachine {  

  80.    private int nodeNum; //节数  

  81.    private int trainNum; //车次  

  82.    @Override  

  83.    public void traffic() {  

  84.        // TODO Auto-generated method stub  

  85.    }  

  86.    public int getNodeNum() {  

  87.        return nodeNum;  

  88.    }  

  89.    public void setNodeNum(int nodeNum) {  

  90.        this.nodeNum = nodeNum;  

  91.    }  

  92.    public int getTrainNum() {  

  93.        return trainNum;  

  94.    }  

  95.    public void setTrainNum(int trainNum) {  

  96.        this.trainNum = trainNum;  

  97.    }  

  98. }  

  99. package com.pattern.SimpleFactory;  

  100. /**

  101. *

  102. *【描述】:抽象类 车

  103. *【作者】:alaric

  104. *【时间 】:May 20, 2012

  105. *【文件】:com.pattern.SimpleFactoryMachine.java

  106. *

  107. */  

  108. public abstract class TrafficMachine {  

  109.    public float power ;  

  110.    public float load ;  

  111.    public abstract void traffic();  

  112.    }  

  113. package com.pattern.SimpleFactory;  

  114. /**

  115. *

  116. *【描述】:类型异常类

  117. *【作者】:alaric

  118. *【时间 】:May 20, 2012

  119. *【文件】:com.pattern.SimpleFactoryTypeErrorException.java

  120. *

  121. */  

  122. public class TypeErrorException extends Exception{

  123.    private static final long serialVersionUID = 562037380358960152L;  

  124.    public TypeErrorException(String message) {  

  125.         super(message);  

  126.        // TODO Auto-generated constructor stub  

  127.    }  

  128. }  


       通过以上分析及其代码列举可知,简单工厂类的构造有三种角色,它们分别是工厂角色,抽象产品角色和具体产品角色。工厂类的创建方法根据传入的参数来判断实例化那个具体的产品实例。

       工厂类角色:这个角色是工厂方法模式的核心,含有与应用紧密相连的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的java类来实现。
       抽象产品角色:担当这个角色的是一个java接口或者java抽象类来实现。往往是工厂产生具体类的父类。
       具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品往往就是一个具体的java类来承担。

简单工厂的优缺点:
        1、优点是因为客户端可以直接消费产品,而不关心具体产品的实现,免除了客户端直接创建产品对象的责任,简单工厂模式就是通过这种方法实现了对责任的分割。
        2、缺点是简单工厂在当产品多层次结构复杂时工厂只能依靠自己,这样就形成了一个万能类,如果这个工厂不能工作了,所有的创建都将不能实现,而且当产品类别多结构复杂的情况下,把所有创建放进一个工厂来,是的后期程序的扩展较为困难。这个困难将在下节(工厂方法)进行讲述。

 
转自:http://alaric.iteye.com/blog/1908619

相关问答

更多
  • 其实我相信你做了3年的java一定了解你所说的设计模式和反射机制在程序早已用过了的把,只是自己平时没注意;设计模式主要是用项目管理,让人看起来通俗易懂.反射机制用到的地方呢也比较多,在用properties和JFreeChart等地方都用到.
  • 这个问题很简单啊,就是一个接口,N个具体类,然后创建一个抽象工厂根据传入的类名生成不同的处理类。首先看看工程结构图: Common接口: package pkg1.pkg2; /** * Common计算接口 * * @author * */ public interface Common { // 接口方法返回结算结果 public long calulate(int a, int b, int c); } package pkg1; import pkg1.pkg2.Common; /** * Car0 ...
  • 在不需要用对象成员的时候就用类成员,这个没什么好说的... 一定要说的话静态方法调用速度快
  • 单体模式 很简单,就是将构造函数变为私有,那么就不能通过new 来创建对象。 同时创建一个 共有的静态的方法来获得实例,代码如下: class Test{ private static Test instance = null; private Test(){} public static Test getInstance(){ if( instance == null ){ instance = new Test(); } return instance ; } } 工厂模式有三个参与者,抽象产品(Pro ...
  • 你是准备学习使用 还是说研究它的底层实现机制这些东西? 如果只是使用 可以暂时不了解这些 ,你也没有这么多精力来了解这么多 你先将框架中的东西用熟练 然后再去了解这些也不迟 spring 的 IOC aop hibernate的 延迟加载 缓存 ,mvc这些学习都需要学习 其实你学习不学习这几个框架都可以对设计模式进行学习 设计模式在日常的版本开发中好处很多 而且在面试的时候 考官也会问设计模式方面的知识
  • 一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。 创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。 创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder Pattern)  原 ...
  • 简单工作设计模式就是把三层结构分成多层,包括数据工厂等,达到设计分层的目的而序列化及反序列化只是对数据进行物理存储和读取的一种方式.
  • 工厂是指生产实例的地方。那就简单一个,直接命名为createInstance()。此方法通常是静态的,而且还会带有参数和返回值。举个例子:例如牛、羊、马、狗都继承动物类,那createInstance()的返回值应该为 动物(因为工厂就是生产动物的嘛,所以返回值也应该为动物),参数应该为动物名称(这样工厂根据名称才知道你要生产哪种动物啊)。这样就可以根据传入的的动物名称,产生一个动物实例。createInstance的实现:switch(动物名称) case 牛:return new 牛();case 羊: ...
  • 工厂是用来造东西的 而你造出来的对象类型是 Namer 所以 Namer nm这样声明(getName(txtName.Text); 这个方法的返回值类型是Namer) nameFact.getName(txtName.Text); 这句话结合你上面的来看 只能是你上面写错了吧 Namer nm =nameFact.getName(txtName.Text); 这句话应该是声明一个姓名对象 用来接收工厂类制造姓名的方法所返回的值 并且你之前的 getName(txtName.Text); 应该是个静态方法 ...
  • 简单工厂模式(Simple Factory Pattern),又称静态工厂模式(Static Factory Pattern)。举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。 女娲造人,这就是简单工厂模式的应用。   首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。   1.)女娲是一个工厂类,也就是简单工厂模式的核心 ...