原文:http://www.runoob.com/design-pattern/design-pattern-intro.html
少许个人理解,如有错误请指出

工厂模式(Factory Pattern)
最常用的设计模式之一。创建型模式。它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来创建对象。

目的:
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。(父类是接口–子类是接口实现类–工厂用来生产接口的实现类)

主要解决:
主要解决接口选择的问题。

何时使用:
我们明确地计划不同条件下创建不同实例时。

如何解决:
让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:
创建过程在其子类执行。
应用实例:

  • 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  • 换数据库只需换方言和驱动就可以。(方言:Oracle,MSSQL,MySQL它们的SQL会有少量的差别,内置函数也会有点不同,感觉上跟方言差不多的意思)

优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

使用场景:
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。

注意事项:(简单的创建对象不要用工厂模式–杀鸡用牛刀)
- 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过
new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

Demo

  • 我们将创建一个 Shape 接口和实现 Shape 接口的实体类。
  • 定义工厂类 ShapeFactory。
  • 之后是FactoryPatternDemo–我们的演示类
    演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

图片:factory_pattern_uml_diagram

步骤 1

创建一个接口。
Shape.java

public interface Shape {void draw();
}

步骤 2
创建实现接口的实体类。
Rectangle.java

public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}

Square.java

public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}

Circle.java

public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}

步骤 3
创建一个工厂,生成基于给定信息的实体类的对象。
ShapeFactory.java

public class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType == null){return null;}     if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}
}

步骤 4
使用该工厂,通过传递类型信息来获取实体类的对象。
FactoryPatternDemo.java

public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();//获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象,并调用它的 draw 方法Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象,并调用它的 draw 方法Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();}
}

步骤 5
验证输出。
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

=================更新
个人理解:
1.创建步骤:

  1. 接口:当有多个类有相似内容时,将相似内容抽出来,写成接口
  2. 具体类:实现接口
  3. 工厂类:创建工厂类,在工厂类通过switch case决定具体返回哪个具体类的实例
  4. 消费者(工厂调用者):new 工厂对象,调用工厂的方法,传参来决定得到的具体实例。

2.为什么使用:

  1. 不使用工厂模式,一般就是直接new对象,此时当对象参数或对象的类名修改时,需要全局搜索并替换成最新的内容,如果使用工厂模式只需要修改具体的实现类和工厂类中的case即可
  2. 主要解决接口选择的问题:比如一个汽车工厂它可以生产奔驰宝马保时捷等上百种车,但是用户只要宝马,那他就不需要知道工厂类其实可以生产上百种车这么复杂的事情,他只要知道调用类似carFactory.getCar(“Benz”);这一个接口就可以了。

设计模式笔记一:工厂模式相关推荐

  1. JAVA设计模式笔记(简单工厂模式)

    有一个水果加工工厂,我们的需求是实现加工水果的功能.常见的做法是创建一个水果抽象类,写一个抽象的加工方法,然后创建具体的水果类去继承抽象类,再去实现抽象方法,最后客户端再去新建对象实例. public ...

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

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

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

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

  4. .NET设计模式(1): 简单工厂模式

    .NET设计模式(1): 简单工厂模式 最近一直在看设计模式,想把自己的学习笔记与大家分享一下,如果能帮助大家的话,我会非常高兴,同时也欢迎大家指出里面的不足.园子里其实关于此类文章已经很多了,如果d ...

  5. php工程模式,PHP设计模式(八):工厂模式

    Introduction 在PHP设计模式(七):设计模式分类中我们提到过创建设计模式(Creation patterns),创建设计模式专注于设计对象(Object)和实例(Instance)的创建 ...

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

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

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

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

  8. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  9. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory). GOF ...

  10. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

最新文章

  1. windows监控——再见zmq
  2. 使用Elasticsearch+filebeat+logstach+kibana构建日志服务平台
  3. 3D数学基础:图形与游戏开发---随笔四
  4. [Qt教程] 第12篇 2D绘图(二)渐变填充
  5. IOC与DI(xml 配置)
  6. 光纤通道(FC: Fibre Channel)
  7. 简单粗暴地理解js原型链--js面向对象编程
  8. tomcat最新版本是多少_Tomcat在Windows 10下的安装配置教程
  9. 机器学习笔记——随机森林
  10. 中的live_张杰两首歌曲连唱彰显LIVE实力 青春演说温暖人心
  11. pythontkinter使按钮失效_python2.7为什么点击了quot;开始quot;按钮后,tkinter上的按钮,图中红色部分,再也点不动了? - SegmentFault 思否...
  12. Intellij IDEA 设置字体加粗
  13. 直播内容抢先看|基于 AUTOSAR 技术的 SOA 软件平台实践
  14. MATLAB利用最速梯度下降法求解f(x)函数极小点
  15. 波士顿法律第一至五季/全集Boston Legal迅雷下载
  16. neu1482 2014辽宁省赛Picking Cabbage(状态压缩)
  17. SPOOLING系统
  18. c语言彩票随机数7位数,产生7个不同的随机数,类似彩票该怎么实现
  19. 今天看完了《勇敢的心》非常感动,收集了些资料!希望大家喜欢。
  20. spark 概述与安装

热门文章

  1. python方法调用方法_Python之方法调用
  2. string常用函数用法集合
  3. win7升级到win10不能上网解决方法
  4. pdf转换成word教程
  5. Oracle Database Gateway 安装
  6. FireBug调试工具笔记
  7. 对不起,如果真是那样,由我来说出那2个字……
  8. CCF201403-1 相反数
  9. html5作品展示的动效,html5动效系列八:8个非常神奇的HTML5动画和应用
  10. PHP百度收录量查询接口源码,PHP百度收录量查询接口源码