转载:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:

举例如下:(我们举一个发送邮件和短信的例子)

首先,创建二者的共同接口:

[java] view plaincopy
  1. public interface Sender {
  2. public void Send();
  3. }

其次,创建实现类:

[java] view plaincopy
  1. public class MailSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is mailsender!");
  5. }
  6. }
[java] view plaincopy
  1. public class SmsSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is sms sender!");
  5. }
  6. }

最后,建工厂类:

[java] view plaincopy
  1. public class SendFactory {
  2. public Sender produce(String type) {
  3. if ("mail".equals(type)) {
  4. return new MailSender();
  5. } else if ("sms".equals(type)) {
  6. return new SmsSender();
  7. } else {
  8. System.out.println("请输入正确的类型!");
  9. return null;
  10. }
  11. }
  12. }

我们来测试下:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produce("sms");
  5. sender.Send();
  6. }
  7. }

输出:this is sms sender!

22、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

将上面的代码做下修改,改动下SendFactory类就行,如下:

[java] view plaincopypublic class SendFactory {  
   public Sender produceMail(){  

  1. return new MailSender();
  2. }
  3. public Sender produceSms(){
  4. return new SmsSender();
  5. }
  6. }

测试类如下:

[java] view plaincopy
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produceMail();
  5. sender.Send();
  6. }
  7. }

输出:this is mailsender!

33、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

[java] view plaincopy
  1. public class SendFactory {
  2. public static Sender produceMail(){
  3. return new MailSender();
  4. }
  5. public static Sender produceSms(){
  6. return new SmsSender();
  7. }
  8. }
[java] view plaincopy
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. Sender sender = SendFactory.produceMail();
  4. sender.Send();
  5. }
  6. }

输出:this is mailsender!

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

设计模式之二:工厂模式相关推荐

  1. 虚无空间java下载_Java进阶篇设计模式之二 ----- 工厂模式

    前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...

  2. 设计模式之二——工厂模式

    1.工厂模式简介 1.1定义 简单工厂模式(Simple Factory Pattern):专门定义一个类(工厂类)来负责创建其他类的实例.可以根据创建方法的参数来返回不同类的实例,被创建的实例通常都 ...

  3. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  6. C#设计模式(2)——简单工厂模式

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂 ...

  7. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

  8. 软件设计模式之路-----工厂模式抽象工厂模式

    系统开发和现实生活是一样的.在现实生活中一个复杂的商品都是通过一个工厂产生,具体工厂怎么产生的我们不需在乎.在软件设计上也可如此,如果一个对象的创建过程比较复杂,便可考虑使用工厂模式. 简单工厂模式 ...

  9. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  10. 设计模式——单例模式、工厂模式

    设计模式--单例模式.工厂模式 一.六大设计原则 开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热 ...

最新文章

  1. C++Primer:字面值常量类调用函数错误(p268书中示例报错)
  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出...
  3. StringBuffer和String,StringBuilder的区别?
  4. 2018年1月3日-江苏地税系统无法正常登陆的解决方案
  5. leetcode笔记--7 Find the Difference
  6. vue项目整合到springboot方法
  7. 【老生谈算法】matlab实现遗传算法优化源码——遗传算法
  8. 在深度学习时代用 HowNet 搞事情 刘知远 01-09
  9. 天线工程手册_天线的原理是什么!?它到底是怎么接收信号的?
  10. 令你的网站获得任意Google PR值的方法!
  11. 【程序员读书】读阮一峰最新作《未来世界的幸存者》有感
  12. 记录一下Mac浏览器劫持searchbaron.com的经历
  13. AutoRunner 功能自动化测试项目实训之AutoRunner产品设计目标(三)
  14. python识图自动化_基于python+appium通过图片对比来做的UI自动化
  15. 单播、广播、多播(组播)的概念和区别
  16. Rancher配置域名证书
  17. 操作系统----大内核与微内核
  18. C#基础--LINQ
  19. SEO实战干货:如何利用老域名打造新站百度快速收录排名!
  20. Web页面布局上的幽灵事件 -- 外边距合并折叠解惑

热门文章

  1. JAVA内存存储数据的位置
  2. 洛谷——P1090 合并果子
  3. 大话主题敏感PageRank
  4. 【面试必备!Mac版本】一文打通Git教程!史上最硬核解析!——双非上岸阿里巴巴系列
  5. 1058 A+B in Hogwarts (20 分)_7行代码AC
  6. Java与C、C++的区别
  7. 详解 nginx 配置文件及构建 web 虚拟主机
  8. 实验详解——Cobbler自动部署最小化安装
  9. hcia是什么等级的证书_华为的HCNA,HCNP,HCIE认证证书都有什么用?
  10. 机器学习如何计算特征的重要性_干货 :机器学习中的特征工程总结